three-ws-see

mcp
Security Audit
Warn
Health Warn
  • License — License: Apache-2.0
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 6 GitHub stars
Code Warn
  • network request — Outbound network request in src/index.js
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

Render any GLB from several angles so an AI agent can look at it, with geometry stats. npm package and MCP tool.

README.md

@three-ws/see

GitHub stars License Last commit PRs welcome AI agent friendly

Give an AI agent eyes for 3D.

Every text-to-3D API on earth answers with a URL to a binary file. A human clicks it. An agent cannot: a .glb is opaque to a language model, so the agent that just generated an asset has no way to check its own work. That is why agentic 3D has been stuck at one shot and a shrug.

This package closes the loop in one call. Hand it a GLB URL and get back frames of the model rendered from several angles, ready to put in front of any multimodal model, plus the geometry facts and a plain reading of what they mean.

npm install @three-ws/see

No key. No account. The service is free.

Look at a model

import { see } from '@three-ws/see';

const look = await see('https://example.com/robot.glb');

look.views;
// [ { view: 'three-quarter', theta: 35, phi: 78, imageUrl: 'https://…/a.png' },
//   { view: 'front', … }, { view: 'side', … }, { view: 'back', … } ]

look.notes;
// [ '12,400 triangles, a normal real-time budget for a hero prop or character.' ]

look.stats;      // { vertices, triangles, materials, textures, animations, … }
look.viewerUrl;  // spin it in a browser
look.arUrl;      // place it in a real room from a phone

Close the loop: generate, look, judge, fix

The reason this exists. An agent that can see its own output stops guessing.

import Anthropic from '@anthropic-ai/sdk';
import { see, toMessageContent } from '@three-ws/see';

const anthropic = new Anthropic();

async function critique(glbUrl, intent) {
  const look = await see(glbUrl);
  const message = await anthropic.messages.create({
    model: 'claude-sonnet-5',
    max_tokens: 512,
    messages: [{
      role: 'user',
      content: [
        { type: 'text', text: `This model was meant to be: ${intent}. Judge it. Is the subject complete and recognisable, is the far side finished, is anything melted or fused? If it needs work, say exactly what to change.` },
        ...(await toMessageContent(look)),
      ],
    }],
  });
  return message.content[0].text;
}

toMessageContent shapes a look into multimodal chat content: one labelled text block per angle followed by the image itself. It passes image URLs by default; { fetchImages: true } inlines base64 for APIs that will not fetch a URL themselves.

Pick your angles

await see(glbUrl, { views: ['back', 'top'], size: 768 });
View What it catches
three-quarter Form and depth, the way a product shot reads (default first)
front Facing, symmetry, the subject's identity
side Profile, depth collapse, flattened geometry
back The half a single-view generator most often leaves unfinished
top Footprint, layout, whether it is hollow
bottom Missing caps, inverted normals, floating geometry

Up to six views per call, size from 128 to 1024 pixels (default 512). Unknown angle names are ignored rather than failing the call, so a guess still returns something useful.

Errors are typed

import { see, SeeError } from '@three-ws/see';

try {
  await see(url);
} catch (err) {
  if (err instanceof SeeError && err.code === 'rate_limited') {
    await new Promise((r) => setTimeout(r, err.retryAfter * 1000));
  }
}

invalid_url, render_failed, rate_limited, timeout, unreachable. A partially-rendered turntable is not an error: you get the frames that worked plus look.missingViews naming the angles that did not, because three good views beat a failure.

Options

Option Default Notes
views ['three-quarter','front','side','back'] Up to 6, from the table above
size 512 Square pixels, 128 to 1024
stats true Set false to skip the geometry pass
baseUrl https://three.ws Point at another deployment
timeoutMs 120000 Rendering holds a browser for seconds
fetch global fetch Inject for tests, proxies, tracing

Using MCP instead?

The same capability is an MCP tool, look_at_model, on https://three.ws/api/mcp-studio. There the frames come back as MCP image content blocks, so a multimodal client renders them straight into the conversation and the model sees the model with no glue code at all.

Related

Apache-2.0.

Support the project

If three-ws-see saves you time, star it on GitHub. Stars are how other developers and AI agents find the repositories worth trusting, and they cost you one click.

Know someone who would use it? Post on X · Share on Bluesky · Share on LinkedIn · Submit to Hacker News · Share on Reddit

Built for AI agents too

Coding agents and LLM tooling can read this repo directly: AGENTS.md, llms.txt, llms-full.txt. Point an agent at https://github.com/nirholas/three-ws-see and it has the context it needs.

More from the same author

Contributors

Contributors

Star history

Star History Chart

Part of three.ws

three.ws is a platform for 3D AI agents with Solana wallets: avatars, a skill marketplace, x402 payments and more than seventy MCP servers. @three-ws/see is one package from it.

Reviews (0)

No results found