Koskamo

3D Valley MCP

An official MCP server operated by 3D Valley that enables AI agents to search and download over 10,000 CC0 3D models, PBR textures, and HDRIs. It supports generating 3D models from images or text, retexturing and remeshing existing assets, and creating seamless PBR textures, all authenticated via OAuth with a free account.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

3D Valley MCP logo, by 3D ValleyVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by 3D Valley
You need:Every tool needs a free account (OAuth sign-in)
MCP endpoint (Streamable HTTP)
https://3dvalley.com/mcp
Vendor documentation

What its tools do

8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

8 of 8 have a description · 8 of 8 declare behavior hints · 1 of 7 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to 3dvalley.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search and download CC0 3D assets by meaning and size
  • Generate textured 3D models from images or text descriptions
  • Retexture or remesh existing 3D models
  • Generate seamless PBR texture sets from descriptions

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
3dvalley 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
8 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

3D Valley: free CC0 3D models, PBR textures and HDRIs, and paid 3D generation. - Look in the free library first (search_assets); every model is a GLB in metres, +Y up, origin at the base. Check size_m before placing. - When nothing fits, generate_model makes one object from a picture or words, for credits the user bought. For game or web use pass max_faces (e.g. 10000), and style lowpoly when the scene uses low-poly assets. account shows the balance and every price; state the price before spending, and pass max_credits. - Long jobs return job_id: call get_job until it is done. Repeating a call never charges twice. - Files on the user's machine go up with upload_file (it returns a curl command). - Library assets are CC0 and need no credit, but when you write credits, a README, a store page or an about screen for a project that uses them, include each asset's credit line (get_asset returns it as credit and credit_html). It credits the maker and helps others find the library.

Tools

8 advertised

search_assets — Search free CC0 3D assets
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search the free CC0 library of 3D models, PBR textures and HDRIs by meaning and filters. Every model is a GLB measured in metres, +Y up, origin at the base. Check size_m before placing an asset; use min_size_m >= 2 for floors and walls. previews (max 6) attaches thumbnails, which is cheaper than downloading the wrong asset. Each result has match (strong, good or weak); when none is better than weak the answer says so, and generate_model is the way to get the object. Read-only, free with a free account.

search_assets input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "q": {
      "type": "string",
      "description": "What you need, in words: \"wooden barrel\", \"mossy rock\", \"sci-fi crate\"."
    },
    "maps": {
      "type": "array",
      "items": {
        "enum": [
          "base_color",
          "normal",
          "roughness",
          "metallic",
          "ao",
          "height",
          "displacement"
        ],
        "type": "string"
      },
      "description": "Must have all of these maps."
    },
    "pack": {
      "type": "string",
      "description": "A pack id from a result (\"kn:mini-skate\"): only assets from that kit, to keep a game in one style."
    },
    "sort": {
      "enum": [
        "relevance",
        "popular",
        "newest"
      ],
      "type": "string"
    },
    "type": {
      "enum": [
        "model",
        "texture",
        "hdri"
      ],
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "default": 8,
      "maximum": 20,
      "minimum": 1
    },
    "style": {
      "enum": [
        "realistic",
        "stylized",
        "lowpoly",
        "scan"
      ],
      "type": "string"
    },
    "cursor": {
      "type": "string",
      "description": "next_cursor from the previous page."
    },
    "format": {
      "enum": [
        "glb",
        "zip",
        "hdr",
        "exr",
        "png",
        "jpg"
      ],
      "type": "string",
      "description": "A file format we serve it in."
    },
    "rigged": {
      "type": "boolean"
    },
    "source": {
      "enum": [
        "polyhaven",
        "ambientcg",
        "kenney",
        "kaykit",
        "quaternius",
        "gobkit",
        "smithsonian",
        "met",
        "khronos",
        "openhdri",
        "cgbookcase",
        "texturecan"
      ],
      "type": "string"
    },
    "min_res": {
      "type": "string",
      "description": "Smallest texture resolution: 1k, 2k, 4k."
    },
    "animated": {
      "type": "boolean"
    },
    "category": {
      "type": "string",
      "description": "A category slug; see the categories in the results."
    },
    "max_tris": {
      "type": "integer",
      "minimum": 0,
      "description": "At most this many triangles (models)."
    },
    "min_tris": {
      "type": "integer",
      "minimum": 0,
      "description": "At least this many triangles (models)."
    },
    "previews": {
      "type": "integer",
      "default": 0,
      "maximum": 6,
      "minimum": 0,
      "description": "Attach this many thumbnails as images, so you can look before downloading."
    },
    "max_size_m": {
      "type": "number",
      "minimum": 0,
      "description": "The largest side at most this many metres."
    },
    "min_size_m": {
      "type": "number",
      "minimum": 0,
      "description": "The largest side at least this many metres. Use 2 or more for floors and walls."
    },
    "similar_to": {
      "type": "string",
      "description": "An asset id: the nearest to it by meaning."
    }
  },
  "additionalProperties": false
}
search_assets output schema
{
  "type": "object",
  "properties": {
    "total": {
      "type": "number"
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "next_cursor": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "additionalProperties": true
}
search_assets annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_asset — Get one CC0 asset
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full details for one library asset: download URLs per format and resolution, size in metres, up axis and origin, texture maps, a credit line (credit, credit_html), related assets, and import notes for Godot, Unity, three.js and Blender. When you write credits or a README for a project using the asset, include its credit line. Read-only, free.

get_asset input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "An asset id from search_assets, e.g. \"ph:wooden_barrel_01\"."
    }
  },
  "additionalProperties": false
}
get_asset output schema
{
  "type": "object",
  "additionalProperties": true
}
get_asset annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
generate_model — Generate a 3D model
Advertised by the server during the last successful anonymous check.
Open-world

Make one 3D object (never a scene) as a textured GLB, from a picture (image) or a description (prompt). Costs credits, which the user bought: image models trellis-2 5, trellis-2-pro 15, hunyuan-3d-3-1-pro 90, tripo-3-1 50, tripo-3-1-detailed 100; from a prompt add the picture model (flux-2-klein 1). Pass max_credits to refuse anything dearer. For a game or the web pass max_faces (5000-20000; the default is 200,000 triangles), and from a prompt style lowpoly to match low-poly kits. The GLB stands on its base at the origin, like library models. Waits about 45 s, then returns job_id for get_job if it is not done. Calling again with the same arguments resumes the same job and never charges twice; pass a new idempotency_key to make another one.

generate_model input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "seed": {
      "type": "integer",
      "minimum": 0
    },
    "image": {
      "type": "string",
      "description": "A picture of one object: an https URL, a data: URI, an upload id from upload_file, or a job id."
    },
    "model": {
      "type": "string",
      "description": "Default trellis-2. See account for every model and its price."
    },
    "style": {
      "enum": [
        "realistic",
        "lowpoly",
        "stylized"
      ],
      "type": "string",
      "description": "From a prompt: lowpoly draws a flat-shaded, flat-colour game asset to match low-poly kits; stylized a hand-painted look."
    },
    "prompt": {
      "type": "string",
      "description": "A description of one object: \"a weathered wooden barrel with iron bands\"."
    },
    "max_faces": {
      "type": "integer",
      "maximum": 1000000,
      "minimum": 5000,
      "description": "Most triangles in the model, at no extra cost: 5,000-20,000 for game or web use (the default is 200,000)."
    },
    "image_model": {
      "type": "string",
      "description": "The picture model for a prompt: flux-2-klein (default), muse-image, gpt-image-2-5."
    },
    "max_credits": {
      "type": "integer",
      "minimum": 0,
      "description": "Refuse the job if it would cost more."
    },
    "wait_seconds": {
      "type": "integer",
      "default": 45,
      "maximum": 50,
      "minimum": 0
    },
    "idempotency_key": {
      "type": "string",
      "description": "Only to make a second, different job from identical arguments."
    }
  },
  "additionalProperties": false
}
generate_model output schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "error": {
      "type": [
        "object",
        "null"
      ]
    },
    "output": {
      "type": [
        "object",
        "null"
      ]
    },
    "status": {
      "type": "string"
    },
    "credits": {
      "type": "object",
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}
generate_model annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
edit_model — Edit a 3D model
Advertised by the server during the last successful anonymous check.
Open-world

Change a model you have: retexture (new PBR textures from a picture or words; trellis-2-texture 5, trellis-2-texture-pro 10, tripo-texture 20, tripo-texture-detailed 40 credits) or remesh (new, clean topology at a face count; tripo-remesh 50 credits). The mesh is an https URL, an upload id from upload_file, a library id (ph:wooden_barrel_01) or a job id, so steps chain without downloading. Waits about 45 s, then returns job_id for get_job. To reduce, compress, convert or repair a file, use gltf-transform or Blender locally.

edit_model input schema
{
  "type": "object",
  "required": [
    "operation",
    "mesh"
  ],
  "properties": {
    "mesh": {
      "type": "string",
      "description": "The model: URL, upl_..., library id, or job_..."
    },
    "image": {
      "type": "string",
      "description": "retexture: the look as a picture."
    },
    "model": {
      "type": "string",
      "description": "retexture or remesh: the model to use."
    },
    "prompt": {
      "type": "string",
      "description": "retexture: the look in words, when there is no picture."
    },
    "options": {
      "type": "object",
      "description": "remesh: faces (500 to 20,000; 10,000 as quads), topology (quads|triangles).",
      "additionalProperties": true
    },
    "operation": {
      "enum": [
        "retexture",
        "remesh"
      ],
      "type": "string"
    },
    "max_credits": {
      "type": "integer",
      "minimum": 0
    },
    "wait_seconds": {
      "type": "integer",
      "default": 45,
      "maximum": 50,
      "minimum": 0
    },
    "idempotency_key": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
edit_model output schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "error": {
      "type": [
        "object",
        "null"
      ]
    },
    "output": {
      "type": [
        "object",
        "null"
      ]
    },
    "status": {
      "type": "string"
    },
    "credits": {
      "type": "object",
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}
edit_model annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
generate_texture — Generate a PBR texture
Advertised by the server during the last successful anonymous check.
Open-world

A seamless PBR texture set (base colour, normal, height, roughness, metallic at 2048 px) from a description, for flux-2-klein-material 2, muse-image-material 5, gpt-image-2-5-material 8 credits.

generate_texture input schema
{
  "type": "object",
  "required": [
    "prompt"
  ],
  "properties": {
    "seed": {
      "type": "integer",
      "minimum": 0
    },
    "model": {
      "type": "string",
      "description": "Default flux-2-klein-material."
    },
    "prompt": {
      "type": "string",
      "description": "The surface: \"mossy cobblestones\", \"brushed steel\"."
    },
    "max_credits": {
      "type": "integer",
      "minimum": 0
    },
    "wait_seconds": {
      "type": "integer",
      "default": 45,
      "maximum": 50,
      "minimum": 0
    },
    "idempotency_key": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
generate_texture output schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "error": {
      "type": [
        "object",
        "null"
      ]
    },
    "output": {
      "type": [
        "object",
        "null"
      ]
    },
    "status": {
      "type": "string"
    },
    "credits": {
      "type": "object",
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}
generate_texture annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_job — Wait for a job
Advertised by the server during the last successful anonymous check.
Advertised read-only

Waits up to about 45 s for a job to finish, or reads where it stands. Safe to call again and again; never charges. When done: download URLs for every file, a preview picture, the model's size in metres and triangle count, and an asset id usable as input to the next step.

get_job input schema
{
  "type": "object",
  "required": [
    "job_id"
  ],
  "properties": {
    "job_id": {
      "type": "string"
    },
    "wait_seconds": {
      "type": "integer",
      "default": 45,
      "maximum": 50,
      "minimum": 0
    }
  },
  "additionalProperties": false
}
get_job output schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "error": {
      "type": [
        "object",
        "null"
      ]
    },
    "output": {
      "type": [
        "object",
        "null"
      ]
    },
    "status": {
      "type": "string"
    },
    "credits": {
      "type": "object",
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}
get_job annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
upload_file — Upload a local file
Advertised by the server during the last successful anonymous check.

The server cannot read the user's disk. This returns an upload id and the exact curl command that sends a local file (a mesh or picture) to it; run that command, then pass the id as the image or mesh of another tool. Uploads last 24 hours.

upload_file input schema
{
  "type": "object",
  "required": [
    "filename",
    "bytes"
  ],
  "properties": {
    "bytes": {
      "type": "integer",
      "minimum": 1,
      "description": "The file's size in bytes (ls -l or stat)."
    },
    "filename": {
      "type": "string",
      "description": "The file's name with its extension, e.g. \"chest.glb\"."
    },
    "content_type": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
upload_file output schema
{
  "type": "object",
  "additionalProperties": true
}
upload_file annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account — Credits and prices
Advertised by the server during the last successful anonymous check.
Advertised read-only

The credit balance, the price of every tool and model in credits (1 credit = $0.01), the rate limits and this key's daily spending cap. Check before spending.

account input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
account output schema
{
  "type": "object",
  "additionalProperties": true
}
account annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
390 ms
95th percentile latency
390 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 390 ms · metadata changed · 8 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http 3d-valley-mcp https://3dvalley.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add 3d-valley-mcp --url https://3dvalley.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable 3d-valley-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "3d-valley-mcp": {
      "url": "https://3dvalley.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "3d-valley-mcp": {
      "type": "streamableHttp",
      "url": "https://3dvalley.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start 3d-valley-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "3d-valley-mcp": {
      "type": "http",
      "url": "https://3dvalley.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http 3d-valley-mcp https://3dvalley.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://3dvalley.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "3d-valley-mcp": {
      "serverUrl": "https://3dvalley.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like 3D Valley MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run 3D Valley MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing