Spaces:
Sleeping
Sleeping
| # ⚒️ FORGE — Complete How-To Guide | |
| ## Table of Contents | |
| 1. [What is FORGE?](#what-is-forge) | |
| 2. [vs ClawHub](#vs-clawhub) | |
| 3. [Deploy to HuggingFace](#deploy) | |
| 4. [Skill Formats](#skill-formats) | |
| 5. [CRUD — Create, Read, Update, Delete](#crud) | |
| 6. [MCP Server — Claude native integration](#mcp) | |
| 7. [Bins & Node Tools](#bins-and-node-tools) | |
| 8. [Claude Skills (Anthropic API)](#claude-skills) | |
| 9. [Agent Quick Start](#agent-quick-start) | |
| 10. [REST API Reference](#rest-api) | |
| --- | |
| ## What is FORGE? | |
| FORGE is a **skill artifactory for AI agents** — like npm, pip, or JFrog Artifactory but for executable agent capabilities. | |
| Every skill is a self-contained, versioned unit that any agent can: | |
| - **Discover** via REST API or MCP protocol | |
| - **Download** as code (Python / Node.js / shell) or as a SKILL.md description | |
| - **Hot-load** at runtime without retraining or redeployment | |
| - **Execute** through a standard `execute()` interface | |
| --- | |
| ## vs ClawHub | |
| | Feature | ClawHub | FORGE | | |
| |---------|---------|-------| | |
| | Primary format | SKILL.md (markdown) | JSON + embedded code | | |
| | Also supports | — | SKILL.md (ClawHub compatible) ✅ | | |
| | Code execution | Instructions only | Live executable Python ✅ | | |
| | MCP Server | ❌ | ✅ | | |
| | Bins / Node tools | Via Nix | Via `runtime` metadata | | |
| | Claude skills | ❌ | ✅ (Anthropic API) | | |
| | HF Space deploy | ❌ | ✅ one-click | | |
| | Vector search | ✅ (OpenAI embeddings) | tag + text search | | |
| | 3000+ community skills | ✅ | growing | | |
| **Key difference:** ClawHub skills are *instructions* (markdown that goes into an LLM prompt). FORGE skills are *executable code* that agents run directly. You can publish both. | |
| --- | |
| ## Deploy | |
| ### HuggingFace Space (recommended) | |
| ```bash | |
| # 1. Create Space at huggingface.co → SDK: Gradio | |
| # 2. Clone your space | |
| git clone https://huggingface.co/spaces/YOUR_NAME/agent-forge | |
| cd agent-forge | |
| # 3. Copy FORGE files into it | |
| cp -r forge/* . | |
| # 4. Push | |
| git add . && git commit -m "Deploy FORGE" && git push | |
| ``` | |
| The `README.md` frontmatter configures the Space: | |
| ```yaml | |
| --- | |
| title: FORGE Agent Skill Artifactory | |
| emoji: ⚒️ | |
| colorFrom: orange | |
| colorTo: red | |
| sdk: gradio | |
| sdk_version: 4.44.0 | |
| app_file: app.py | |
| pinned: true | |
| --- | |
| ``` | |
| ### Local dev | |
| ```bash | |
| pip install -r requirements.txt | |
| python app.py | |
| # → http://localhost:7860 | |
| ``` | |
| --- | |
| ## Skill Formats | |
| FORGE supports **three skill formats**: | |
| ### Format 1: JSON (executable Python) | |
| Best for: skills that agents hot-load and execute directly. | |
| ```json | |
| { | |
| "id": "my_skill", | |
| "name": "My Skill", | |
| "version": "1.0.0", | |
| "description": "What this skill does", | |
| "author": "yourname", | |
| "tags": ["utility"], | |
| "dependencies": ["requests"], | |
| "runtime": "python", | |
| "schema": { | |
| "input": { "text": "str" }, | |
| "output": { "result": "str" } | |
| }, | |
| "code": "def execute(text: str) -> dict:\n return {'result': text.upper()}" | |
| } | |
| ``` | |
| ### Format 2: SKILL.md (ClawHub compatible) | |
| Best for: LLM-readable instructions that go into agent prompts. | |
| ```markdown | |
| --- | |
| name: my-skill | |
| version: 1.0.0 | |
| description: Does something useful | |
| author: yourname | |
| tags: [utility, text] | |
| runtime: instructions | |
| --- | |
| # My Skill | |
| ## Purpose | |
| Explain what this skill teaches an agent to do. | |
| ## Usage | |
| When the user asks to process text, do the following: | |
| 1. Step one | |
| 2. Step two | |
| ## Examples | |
| Input: "hello world" | |
| Output: "HELLO WORLD" | |
| ``` | |
| ### Format 3: Node.js / Shell tool | |
| Best for: wrapping CLI tools, Node scripts, or system binaries. | |
| ```json | |
| { | |
| "id": "node_parser", | |
| "name": "JSON Parser", | |
| "version": "1.0.0", | |
| "runtime": "node", | |
| "dependencies_node": ["lodash"], | |
| "bins": ["jq"], | |
| "code": "const _ = require('lodash');\nfunction execute({data}) {\n return { keys: _.keys(JSON.parse(data)) };\n}\nmodule.exports = { execute };" | |
| } | |
| ``` | |
| --- | |
| ## CRUD | |
| ### CREATE — Publish a new skill | |
| **Via UI:** Go to the "📦 Publish" tab → paste your skill JSON → click Publish. | |
| **Via API:** | |
| ```bash | |
| curl -X POST https://YOUR_SPACE.hf.space/api/v1/skills \ | |
| -H "Content-Type: application/json" \ | |
| -d @my_skill.json | |
| ``` | |
| **Via Python agent:** | |
| ```python | |
| forge = bootstrap_forge() | |
| result = forge.publish({ | |
| "id": "my_skill", | |
| "name": "My Skill", | |
| "version": "1.0.0", | |
| "description": "...", | |
| "author": "me", | |
| "tags": ["utility"], | |
| "code": "def execute(**kwargs): return {'ok': True}" | |
| }) | |
| ``` | |
| --- | |
| ### READ — Discover and download skills | |
| **Browse UI:** Go to "🔍 Browse" tab — search by keyword or filter by tag. | |
| **Read one skill (metadata only):** | |
| ```bash | |
| GET /api/v1/skills/calculator | |
| ``` | |
| **Read skill code (for hot-loading):** | |
| ```bash | |
| GET /api/v1/skills/calculator/code | |
| ``` | |
| **Download as .py file:** | |
| ```bash | |
| GET /api/v1/skills/calculator/download | |
| ``` | |
| **Full manifest (all skills + code for offline cache):** | |
| ```bash | |
| GET /api/v1/manifest | |
| ``` | |
| **Search:** | |
| ```bash | |
| GET /api/v1/search?q=math | |
| GET /api/v1/skills?tag=web | |
| ``` | |
| --- | |
| ### UPDATE — Publish a new version | |
| FORGE uses **semver versioning**. To update a skill, publish it again with a bumped version: | |
| ```json | |
| { | |
| "id": "calculator", | |
| "version": "1.1.0", ← bump this | |
| ... | |
| } | |
| ``` | |
| Previous versions are kept on disk as `calculator.v1.0.0.json`. | |
| **Via UI:** Skill Detail tab → "Edit" → modify → save as new version. | |
| --- | |
| ### DELETE — Remove a skill | |
| **Via UI:** Skill Detail tab → "🗑 Delete" button (with confirmation). | |
| **Via API:** | |
| ```bash | |
| DELETE /api/v1/skills/my_skill | |
| ``` | |
| --- | |
| ## MCP | |
| FORGE exposes an **MCP (Model Context Protocol) server** so Claude Desktop, Claude API, and any MCP client can discover and use skills natively. | |
| ### Connect Claude to FORGE | |
| Add to your `claude_desktop_config.json`: | |
| ```json | |
| { | |
| "mcpServers": { | |
| "forge": { | |
| "command": "npx", | |
| "args": ["-y", "mcp-remote", "https://YOUR_SPACE.hf.space/mcp/sse"] | |
| } | |
| } | |
| } | |
| ``` | |
| Or via the API with SSE: | |
| ```python | |
| import anthropic | |
| client = anthropic.Anthropic() | |
| response = client.beta.messages.create( | |
| model="claude-opus-4-6", | |
| max_tokens=1024, | |
| tools=[], | |
| mcp_servers=[{ | |
| "type": "url", | |
| "url": "https://YOUR_SPACE.hf.space/mcp/sse", | |
| "name": "forge" | |
| }], | |
| messages=[{"role": "user", "content": "List all math skills in FORGE"}] | |
| ) | |
| ``` | |
| ### MCP Tools exposed by FORGE | |
| | Tool | Description | | |
| |------|-------------| | |
| | `forge_list_skills` | List all skills, optionally filtered | | |
| | `forge_search` | Semantic search across skills | | |
| | `forge_get_skill` | Get full skill including code | | |
| | `forge_get_code` | Get executable code for a skill | | |
| | `forge_publish_skill` | Publish a new skill | | |
| | `forge_get_stats` | Registry statistics | | |
| --- | |
| ## Bins and Node Tools | |
| Skills can declare required system binaries and Node packages: | |
| ```json | |
| { | |
| "id": "pdf_extractor", | |
| "runtime": "python", | |
| "bins": ["pdftotext", "gs"], | |
| "dependencies": ["pypdf2"], | |
| "install_notes": "apt-get install poppler-utils ghostscript", | |
| "code": "..." | |
| } | |
| ``` | |
| ```json | |
| { | |
| "id": "image_optimizer", | |
| "runtime": "node", | |
| "bins": ["sharp", "imagemagick"], | |
| "dependencies_node": ["sharp", "glob"], | |
| "code": "const sharp = require('sharp'); ..." | |
| } | |
| ``` | |
| Agents check `skill.bins` before executing and can skip skills whose binaries aren't available on the current host. | |
| ### Shell/Bin skill example | |
| ```json | |
| { | |
| "id": "git_status", | |
| "runtime": "shell", | |
| "bins": ["git"], | |
| "code": "#!/bin/bash\ngit -C \"$1\" status --porcelain" | |
| } | |
| ``` | |
| --- | |
| ## Claude Skills | |
| Skills that call the **Anthropic API** — these give your agent Claude-powered capabilities it can invoke as tools. | |
| ### Example: Claude Skill structure | |
| ```json | |
| { | |
| "id": "claude_summarizer", | |
| "runtime": "python", | |
| "dependencies": ["anthropic"], | |
| "env_required": ["ANTHROPIC_API_KEY"], | |
| "code": "import anthropic\n\ndef execute(text: str, style: str = 'bullet') -> dict:\n client = anthropic.Anthropic()\n msg = client.messages.create(\n model='claude-haiku-4-5-20251001',\n max_tokens=512,\n messages=[{'role': 'user', 'content': f'Summarize as {style} points:\\n{text}'}]\n )\n return {'summary': msg.content[0].text}\n" | |
| } | |
| ``` | |
| ### How agents use Claude skills | |
| ```python | |
| forge = bootstrap_forge() | |
| summarizer = forge.load("claude_summarizer") | |
| # Agents set ANTHROPIC_API_KEY in their environment | |
| result = summarizer.execute( | |
| text="Long article text...", | |
| style="executive" | |
| ) | |
| # → {"summary": "• Key point 1\n• Key point 2..."} | |
| ``` | |
| ### Available Claude skills in FORGE | |
| | Skill ID | What it does | | |
| |----------|-------------| | |
| | `claude_chat` | Single-turn Q&A with Claude | | |
| | `claude_summarizer` | Summarize text in various styles | | |
| | `claude_extractor` | Extract structured data from text | | |
| | `claude_judge` | Evaluate/score outputs (LLM-as-judge) | | |
| | `claude_coder` | Generate code from a spec | | |
| --- | |
| ## Agent Quick Start | |
| ```python | |
| import requests, types | |
| # ── Bootstrap (one HTTP call) ────────────────────────── | |
| def bootstrap_forge(url="https://chris4k-agent-forge.hf.space"): | |
| r = requests.get(f"{url}/api/v1/skills/forge_client/code") | |
| m = types.ModuleType("forge_client") | |
| exec(r.json()["code"], m.__dict__) | |
| return m.ForgeClient(url) | |
| forge = bootstrap_forge() | |
| # ── Discover ─────────────────────────────────────────── | |
| all_skills = forge.list() # all skills | |
| math_skills = forge.list(tag="math") # by tag | |
| results = forge.search("web scraping") # full-text search | |
| # ── Load & Execute ───────────────────────────────────── | |
| calc = forge.load("calculator") | |
| search = forge.load("web_search") | |
| memory = forge.load("memory_store") | |
| fetcher = forge.load("http_fetch") | |
| claude = forge.load("claude_chat") # Claude skill | |
| # Run them | |
| print(calc.execute(expression="2**32 / 1024")) | |
| print(search.execute(query="AI news today", max_results=3)) | |
| memory.execute(action="set", key="goal", value="research AI", ttl=3600) | |
| page = fetcher.execute(url="https://example.com", max_chars=2000) | |
| reply = claude.execute(prompt="What is MCP?") | |
| # ── Publish your own ─────────────────────────────────── | |
| forge.publish({ | |
| "id": "my_skill", | |
| "name": "My Skill", | |
| "version": "1.0.0", | |
| "description": "Does something useful", | |
| "author": "yourname", | |
| "tags": ["utility"], | |
| "code": "def execute(**kwargs): return {'ok': True, 'data': kwargs}" | |
| }) | |
| ``` | |
| --- | |
| ## REST API Reference | |
| Base URL: `https://YOUR_SPACE.hf.space` | |
| | Method | Path | Description | | |
| |--------|------|-------------| | |
| | `GET` | `/api/v1/manifest` | Full manifest (all skills + code) | | |
| | `GET` | `/api/v1/skills` | List skills. Params: `?tag=` `?q=` | | |
| | `GET` | `/api/v1/skills/{id}` | Get skill metadata + code | | |
| | `GET` | `/api/v1/skills/{id}/code` | Minimal code payload for hot-loading | | |
| | `GET` | `/api/v1/skills/{id}/download` | Download as `.py` file | | |
| | `POST` | `/api/v1/skills` | Publish new skill (JSON body) | | |
| | `PUT` | `/api/v1/skills/{id}` | Update skill (new version) | | |
| | `DELETE` | `/api/v1/skills/{id}` | Delete skill | | |
| | `GET` | `/api/v1/search?q=` | Full-text search | | |
| | `GET` | `/api/v1/tags` | All tags | | |
| | `GET` | `/api/v1/stats` | Registry statistics | | |
| | `GET` | `/mcp/sse` | MCP Server-Sent Events endpoint | | |
| | `POST` | `/mcp` | MCP JSON-RPC endpoint | | |
| --- | |
| *Built by Chris4K · ki-fusion-labs.de · MIT License* | |