AXIS Avatar Foundry

3D avatar/asset foundry: text/image -> rigged, validated, engine-ready GLB via x402.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
98%
Naming quality
84%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,432Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (2.68% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "axis-avatar-foundry": {
      "url": "https://api.avatar.jonathanarvay.com/mcp"
    }
  }
}

Remote endpoints

https://api.avatar.jonathanarvay.com/mcpstreamable-http

What it can do

Tool inventory

Tools (14)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢axis_list_capabilities(kind)

List all AXIS Foundry capabilities (input formats, export platforms, validation rules). [Free — no payment required.]

Input Schema

{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "description": "Filter by capability kind",
      "enum": [
        "input_format",
        "export_platform",
        "validation_rule"
      ]
    }
  },
  "examples": [
    {
      "kind": "export_platform"
    }
  ]
}
🟢axis_validate(file_path, platform, profile)

Validate an avatar mesh file. Returns pass/warn/fail counts and detailed rule results. [Paid: $0.25 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to mesh file (.glb, .obj, .stl, etc.)"
    },
    "platform": {
      "type": "string",
      "description": "Target platform for platform-specific validation",
      "enum": [
        "unity",
        "unreal",
        "godot",
        "roblox",
        "axis_engine"
      ]
    },
    "profile": {
      "type": "string",
      "description": "Validation strictness profile",
      "enum": [
        "default",
        "strict",
        "lenient"
      ]
    }
  },
  "required": [
    "file_path"
  ],
  "examples": [
    {
      "file_path": "avatars/hero.glb",
      "platform": "unity",
      "profile": "strict"
    }
  ]
}
🟢axis_inspect(file_path)

Inspect an avatar's contract state and provenance chain (stage, bone/vertex counts, provenance step count, chain_valid + any broken links). Does not return a quality grade — use axis_validate for pass/warn/fail rule results. [Paid: $0.10 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to mesh file"
    }
  },
  "required": [
    "file_path"
  ],
  "examples": [
    {
      "file_path": "avatars/hero.glb"
    }
  ]
}
🟢axis_compare(file_a, file_b, sections)

Compare two avatar contracts. Returns similarity score and section-level diffs. [Paid: $0.10 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "file_a": {
      "type": "string",
      "description": "Path to first mesh file"
    },
    "file_b": {
      "type": "string",
      "description": "Path to second mesh file"
    },
    "sections": {
      "type": "array",
      "description": "Limit comparison to specific contract sections"
    }
  },
  "required": [
    "file_a",
    "file_b"
  ],
  "examples": [
    {
      "file_a": "avatars/hero_v1.glb",
      "file_b": "avatars/hero_v2.glb"
    }
  ]
}
🟢axis_process(file_path, platform, export)

Run the full AXIS avatar pipeline (classify → normalize → rig → skin → validate). Returns contract summary. [Paid: $1.50 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to mesh file"
    },
    "platform": {
      "type": "string",
      "description": "Target platform",
      "enum": [
        "unity",
        "unreal",
        "godot",
        "roblox",
        "axis_engine"
      ]
    },
    "export": {
      "type": "boolean",
      "description": "Also export to the target platform"
    }
  },
  "required": [
    "file_path"
  ],
  "examples": [
    {
      "file_path": "avatars/hero.glb",
      "platform": "unreal",
      "export": true
    }
  ]
}
🟢post_process_mesh(glb_base64, mesh_url, asset_kind, platform, polygon_tier, ...)

Post-process a RAW generated mesh (normalize → mesh-repair → rig/skin → validate → export) and return the finished, validated GLB as base64. The inline counterpart of axis_process (which needs a server file path) — the generation post-process step, callable by an LLM/agent that holds the mesh bytes (e.g. fresh TRELLIS output) or a URL to them. Provide the mesh EXACTLY one of two ways: inline as base64 (glb_base64) or as an HTTPS URL (mesh_url) — the URL's host must be on this server's operator-configured allowlist (off by default; an unconfigured allowlist refuses every mesh_url call, it is never open to an arbitrary host). Providing both or neither is a real input error. [Paid: $1.50 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "glb_base64": {
      "type": "string",
      "description": "Base64-encoded raw binary GLB to post-process. Provide exactly one of glb_base64 or mesh_url."
    },
    "mesh_url": {
      "type": "string",
      "description": "HTTPS URL to fetch the raw GLB from instead of inline base64 (e.g. a presigned storage URL) — the host must be on this server's configured allowlist (off by default). Provide exactly one of glb_base64 or mesh_url."
    },
    "asset_kind": {
      "type": "string",
      "description": "Asset kind (skinning auto-on for avatar only)",
      "enum": [
        "avatar",
        "prop",
        "vehicle",
        "environment",
        "vfx",
        "weapon_armor",
        "character_accessory",
        "generic"
      ]
    },
    "platform": {
      "type": "string",
      "description": "Target engine platform (adds export validation)",
      "enum": [
        "unity",
        "unreal",
        "godot",
        "roblox",
        "axis_engine"
      ]
    },
    "polygon_tier": {
      "type": "string",
      "description": "Decimation tier for the output mesh"
    },
    "run_skinning": {
      "type": "boolean",
      "description": "Override skinning (default: avatars only)"
    }
  },
  "examples": [
    {
      "glb_base64": "Z2xURgIAAAA...",
      "asset_kind": "avatar",
      "platform": "roblox"
    }
  ]
}
🟢axis_export(file_path, platform)

Export an avatar to a target engine platform with validation and HMAC-signed manifest. [Paid: $0.50 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to mesh file"
    },
    "platform": {
      "type": "string",
      "description": "Target platform",
      "enum": [
        "unity",
        "unreal",
        "godot",
        "roblox",
        "axis_engine"
      ]
    }
  },
  "required": [
    "file_path",
    "platform"
  ],
  "examples": [
    {
      "file_path": "avatars/hero.glb",
      "platform": "godot"
    }
  ]
}
🟢axis_manifest_verify(manifest, expected_hash)

Verify an export manifest's integrity and optionally check content hash. [Paid: $0.10 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "manifest": {
      "type": "object",
      "description": "Export manifest JSON object"
    },
    "expected_hash": {
      "type": "string",
      "description": "Expected content hash for verification"
    }
  },
  "required": [
    "manifest"
  ],
  "examples": [
    {
      "manifest": {
        "platform": "unity",
        "artifact_hash": "…"
      },
      "expected_hash": "…"
    }
  ]
}
🟢repair_mesh(file_path, scale_unit, up_axis, remove_degenerates, fix_normals)

Repair a mesh into AXIS canonical frame (scale/axis/degenerates/normals) and return repair metrics. [Paid: $0.75 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to mesh file"
    },
    "scale_unit": {
      "type": "string",
      "description": "Source scale unit",
      "enum": [
        "meters",
        "centimeters",
        "millimeters",
        "inches",
        "feet"
      ]
    },
    "up_axis": {
      "type": "string",
      "description": "Source up axis",
      "enum": [
        "Y",
        "Z",
        "-Z",
        "X",
        "-Y"
      ]
    },
    "remove_degenerates": {
      "type": "boolean",
      "description": "Remove zero-area triangles"
    },
    "fix_normals": {
      "type": "boolean",
      "description": "Recalculate missing normals"
    }
  },
  "required": [
    "file_path"
  ],
  "examples": [
    {
      "file_path": "raw_scans/statue.obj",
      "scale_unit": "centimeters",
      "up_axis": "Z"
    }
  ]
}
🟢retarget_animation(clip_name, platform, drop_unmapped)

Retarget a built-in animation clip to a platform mapping and report coverage + deterministic hashes. [Paid: $0.75 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "clip_name": {
      "type": "string",
      "description": "Built-in clip name from animation library"
    },
    "platform": {
      "type": "string",
      "description": "Target platform mapping",
      "enum": [
        "unity",
        "unreal",
        "godot",
        "roblox",
        "axis_engine"
      ]
    },
    "drop_unmapped": {
      "type": "boolean",
      "description": "Drop channels not found in the target mapping"
    }
  },
  "required": [
    "clip_name",
    "platform"
  ],
  "examples": [
    {
      "clip_name": "walk_cycle",
      "platform": "unreal"
    }
  ]
}
🟢roblox_compliance_check(file_path)

Run Roblox R15 compliance checks against a mesh using canonical pipeline outputs. [Paid: $0.25 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; settled only on a successful (non-error) result.]

Input Schema

{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to mesh file"
    }
  },
  "required": [
    "file_path"
  ],
  "examples": [
    {
      "file_path": "avatars/hero.glb"
    }
  ]
}
🟡generate_avatar_from_text(prompt, platform, polygon_tier, texture_size, asset_kind, ...)

PAID (x402, 5 USDC): generate a production 3D avatar from a text prompt — xAI concept image → TRELLIS.2 GPU mesh → full canonical post-process (repair/validate/export). Payment settles ONLY when generation completes; a failed generation is never charged. Returns a job_id — poll with the free get_generation_status tool (typical runtime 5-15 minutes). Pass idempotency_key when a retry is possible (timeout/5xx) — replaying the same key returns the original job_id instead of a second GPU job/charge. [Paid: $5.00 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; DEFERRED settlement — charged only when the generation job completes, a failed job is never charged. Poll get_generation_status (free).]

Input Schema

{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "What to generate (subject description)"
    },
    "platform": {
      "type": "string",
      "description": "Target engine (adds rigging + engine export)",
      "enum": [
        "unity",
        "unreal",
        "godot",
        "roblox",
        "axis_engine"
      ]
    },
    "polygon_tier": {
      "type": "string",
      "description": "Quality tier (defaults to the platform's configured tier)",
      "enum": [
        "mobile_light",
        "mobile_standard",
        "web_vr",
        "desktop_standard",
        "desktop_high",
        "film_vfx",
        "ultra_hd"
      ]
    },
    "texture_size": {
      "type": "number",
      "description": "Texture bake size in px (defaults per platform, else 2048)"
    },
    "asset_kind": {
      "type": "string",
      "description": "Asset taxonomy",
      "enum": [
        "avatar",
        "prop",
        "vehicle",
        "environment",
        "vfx",
        "weapon_armor",
        "character_accessory",
        "generic"
      ]
    },
    "idempotency_key": {
      "type": "string",
      "description": "Optional caller-chosen dedup key (<=200 chars, [A-Za-z0-9_.:-]). Replaying the same key (per payer) returns the original job_id — no new GPU job, no new charge. Use on any retry after a timeout/5xx."
    }
  },
  "required": [
    "prompt"
  ],
  "examples": [
    {
      "prompt": "a friendly adventurer character, fantasy game hero",
      "platform": "unity"
    }
  ]
}
🟡generate_avatar_from_image(image_b64, prompt, platform, polygon_tier, texture_size, ...)

PAID (x402, 6 USDC): generate a production 3D avatar from a reference photo (base64) — xAI A-pose normalize → TRELLIS.2 GPU mesh → full canonical post-process. Payment settles ONLY when generation completes; a failed generation is never charged. Returns a job_id — poll with the free get_generation_status tool (typical runtime 5-15 minutes). Pass idempotency_key when a retry is possible (timeout/5xx) — replaying the same key returns the original job_id instead of a second GPU job/charge. [Paid: $6.00 USDC via x402 for unauthenticated calls on the hosted /mcp endpoint; DEFERRED settlement — charged only when the generation job completes, a failed job is never charged. Poll get_generation_status (free).]

Input Schema

{
  "type": "object",
  "properties": {
    "image_b64": {
      "type": "string",
      "description": "Base64-encoded reference image (PNG/JPEG)"
    },
    "prompt": {
      "type": "string",
      "description": "Optional style/subject hint alongside the image"
    },
    "platform": {
      "type": "string",
      "description": "Target engine (adds rigging + engine export)",
      "enum": [
        "unity",
        "unreal",
        "godot",
        "roblox",
        "axis_engine"
      ]
    },
    "polygon_tier": {
      "type": "string",
      "description": "Quality tier (defaults to the platform's configured tier)",
      "enum": [
        "mobile_light",
        "mobile_standard",
        "web_vr",
        "desktop_standard",
        "desktop_high",
        "film_vfx",
        "ultra_hd"
      ]
    },
    "texture_size": {
      "type": "number",
      "description": "Texture bake size in px (defaults per platform, else 2048)"
    },
    "asset_kind": {
      "type": "string",
      "description": "Asset taxonomy",
      "enum": [
        "avatar",
        "prop",
        "vehicle",
        "environment",
        "vfx",
        "weapon_armor",
        "character_accessory",
        "generic"
      ]
    },
    "idempotency_key": {
      "type": "string",
      "description": "Optional caller-chosen dedup key (<=200 chars, [A-Za-z0-9_.:-]). Replaying the same key (per payer) returns the original job_id — no new GPU job, no new charge. Use on any retry after a timeout/5xx."
    }
  },
  "required": [
    "image_b64"
  ],
  "examples": [
    {
      "image_b64": "iVBORw0KGgo...",
      "platform": "unity"
    }
  ]
}
🟢get_generation_status(job_id, idempotency_key, payer)

FREE: poll a generation job submitted by the paid generate tools. Returns status/progress; once complete AND the deferred payment has settled, returns the download URLs. A failed generation reports charged=false. Look up by job_id, or by idempotency_key + payer if the job_id was lost. [Free — no payment required.]

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "Job id returned by a generate tool"
    },
    "idempotency_key": {
      "type": "string",
      "description": "Alternate lookup key: the idempotency_key passed to the original generate call. Requires payer."
    },
    "payer": {
      "type": "string",
      "description": "x402 payer address the original generate call used — required when looking up by idempotency_key (scopes the key to its owner)."
    }
  },
  "examples": [
    {
      "job_id": "cd464f2f473a4b6e"
    }
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded14 tools
verifiedversion not recorded14 tools