Pose Lab
PYPI · POSELAB-MCP
Measured spatial answers for posing first-person arms and a rifle in Blender
Available components
Last scanned (18 hours ago)
Scores higher than 67% of PyPI servers
Category Design and Media
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 29 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability53
- AI-judged instruction clarity (fair).Partial
- Context-footprint check failed: tool/resource definitions use about 4587 tokens (~147/item across 31 items; 31 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage79
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 36% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 31 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 32 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 15 Oct 26 +26
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
- Tool coverage: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- First check of Tool coverage: 36 functional
- First check of Schema quality: fail functional
- First check of Schema quality: fair functional
- First check of Destructive annotations: pass functional
- First check of Schema quality: fail functional
- 14 Oct 26 0
- Security disclosure: fail → unverified ▼ functional
- Package version: 0.5.0 → 0.7.0 functional
- Package version: 0.5.0 → 0.6.0 functional
- 13 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- Package version: 0.4.0 → 0.5.0 functional
- 12 Oct 26 24
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 16 Oct 2026 · Analysed pypi/poselab-mcp@0.7.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 29 packages
| Packages resolved | 29 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
anatomy ~378
Each arm against the human arm's limits. Rules: the elbow stays at least 2 cm below the shoulder while the hand works the gun; the elbow is a hinge bent 5 to 150 degrees; the wrist stays within 30 degrees of the forearm's line and inside its joint range (flexion 80, extension 70, radial 20, ulnar 30: the AAOS normal values); the hand's roll belongs to the forearm, not the wrist joint: the forearm turns at most 80 degrees each way from thumb up (pronation and supination, forearm_rotation_deg), and on a rig with forearm twist bones no link along the forearm rolls more than 50 degrees (forearm_links_deg: the skin wrings there); without twist bones, the wrist's own twist against the idle grip stays within 30 (wrist_twist_deg). Each finger joint curls only toward the palm within its range (knuckle -30..100, middle joint -5..110, end joint -10..90) and stays in the finger's own plane: no hyperextended or twisted finger. The thumb's knuckle bends -10..60 and its end joint -15..90 across the palm; its base spreads at most 80 from the index metacarpal and sits at most 20 behind the palm. A rig's limits, finger_limits and thumb_limits override these. Each rule reads the value as reported (whole degrees). ok false lists every rule a pose breaks. Fix a broken rule by moving the rifle, the grip or the elbow's pole, never by bending a joint further. arm_ranges gives the research behind each limit.
| Name | Type | Req | Description |
|---|---|---|---|
| fingers | boolean | – | – |
| side | string | – | – |
No output schema declared.
No examples provided.
arm_ranges ~119
The research behind anatomy's limits: for each joint of the arm (shoulder, elbow, forearm, wrist, finger knuckle, middle and end joints, thumb), the AAOS normal range (the 1965 table; tables_differ shows where other tables disagree), the range daily tasks use (Morrey 1981, Palmer 1985, Ryu 1991, Bain 2015), the value anatomy checks, and why it differs from the standard where it does. Full citations included. Needs no rig.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
check_set ~94
Every check on a clip in one summary for a gate: the worst clearance and when, the frames that break an arm or finger rule, the frames a hand in hold_sides is not holding, and each frame's numbers.
| Name | Type | Req | Description |
|---|---|---|---|
| clearance_max_cm | number | – | – |
| clip | string | yes | – |
| hold_sides | array | – | – |
| ignore | array | – | – |
| sides | string | – | – |
No output schema declared.
No examples provided.
clearance ~158
How deep the rifle sits inside the arms (capsules: forearm 3 cm, palm 1.8 cm, finger segments 0.75 cm). worst_cm 0 means nothing touches. The deepest contacts by segment, with the rifle point in the frame.
| Name | Type | Req | Description |
|---|---|---|---|
| frame | string | – | gun: the gun bone, cm (+X gun's left, +Y barrel, +Z up); arms: the arms' space, cm; view: from the eye, cm (+X right, +Y forward, +Z up) |
| ignore | array | – | segment names, prefixes or wildcards to leave out (thumb, index3_r, *_l) |
| parts | string | – | – |
| top | integer | – | – |
No output schema declared.
No examples provided.
describe ~17
What is loaded and the conventions every tool uses.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
distance ~162
The distance between two points, cm, and b minus a in the frame.
| Name | Type | Req | Description |
|---|---|---|---|
| a | – | yes | a name (a bone such as hand_l, a fingertip such as index_tip_l, a rig point such as port) or [x, y, z] in the frame |
| b | – | yes | a name (a bone such as hand_l, a fingertip such as index_tip_l, a rig point such as port) or [x, y, z] in the frame |
| frame | string | – | gun: the gun bone, cm (+X gun's left, +Y barrel, +Z up); arms: the arms' space, cm; view: from the eye, cm (+X right, +Y forward, +Z up) |
No output schema declared.
No examples provided.
faces_eye ~100
How squarely a surface faces the eye: facing 1 square on, 0 edge on, below 0 turned away.
| Name | Type | Req | Description |
|---|---|---|---|
| normal | – | – | the surface's normal, gun frame; a rig normal by the point's name if left out |
| point | – | – | a name (a bone such as hand_l, a fingertip such as index_tip_l, a rig point such as port) or [x, y, z] in the frame |
No output schema declared.
No examples provided.
fix_clip ~314
Mends a clip against the checks and stores a new clip (out, default <clip>_fixed): pops are blended again from the good frames round them; a hold puts the hand back on its grip; a contact moves the wrist until the point touches its mark; clearance swings each elbow about its shoulder-wrist line (the wrist kept) by the least angle that clears, spread over neighbouring frames; anatomy swings the elbow the same way until it sits under the shoulder inside its bend, then turns the wrist back inside its limits and each finger joint back inside its range. Reports the scan before and after.
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | yes | each {type, ...}: clearance (parts, ignore, max_cm), anatomy (side both|l|r, fingers: the rules broken, counted), grip (side, back_max_cm, palm_max_cm: the hand's wrong-side or too-deep contacts, cou… |
| clip | string | yes | – |
| max_swing_deg | number | – | – |
| out | – | – | – |
| spread_frames | integer | – | – |
No output schema declared.
No examples provided.
grip ~495
How each hand touches the rifle: with the palm or with the back. A hand holds with its palm and the palm sides of its fingers. The back of the hand toward the rifle, or the rifle inside the back of the hand or of a finger, is a physical error; clearance with palms and fingers ignored never shows it. For each hand: touching (some part within hold_within_cm), holding (touching, the palm facing the rifle and its surface within palm_within_cm: palm_gap_cm; a fingertip on the rifle with the palm off it is not holding), palm_faces_rifle (1 square on, below 0 the back of the hand toward it), palm_contact_cm and back_contact_cm (the deepest rifle point inside the hand on each side), and bad: every rule broken. ok false lists them. The palm side may press in up to palm_max_cm (the capsules are rounder than a palm); the back side only up to back_max_cm. hold true: a hand that is not holding breaks a rule (use it to check a hand really holds something). Fix a wrong-side hold by turning the hand or the grip, not by moving a finger through the rifle. grasping: the thumb and a finger pinch the rifle from opposite sides, each within contact_cm of it and their directions from its surface at least 180 - 2 atan(friction) degrees apart (127 at friction 0.5); grasp_opposition_deg is the widest thumb to finger angle, digits_touching the digits on the rifle. grasp true: a hand that is not grasping breaks a rule (use it for a hand meant to hold a part, such as a magazine).
| Name | Type | Req | Description |
|---|---|---|---|
| back_max_cm | number | – | – |
| contact_cm | number | – | – |
| frame | string | – | gun: the gun bone, cm (+X gun's left, +Y barrel, +Z up); arms: the arms' space, cm; view: from the eye, cm (+X right, +Y forward, +Z up) |
| friction | number | – | – |
| grasp | boolean | – | – |
| hold | boolean | – | – |
| hold_within_cm | number | – | – |
| palm_max_cm | number | – | – |
| palm_within_cm | number | – | – |
| side | string | – | – |
No output schema declared.
No examples provided.
list_rigs ~31
The rigs to load: the built-in sample and those in the rigs file (POSELAB_RIGS).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
load_clip ~90
Adds a clip from a file: .pose.json bone data, an FBX animation, or a BVH (for example a text-to-motion model's output). A relative path is taken from the rigs file's folder. Reports how well its skeleton fits.
| Name | Type | Req | Description |
|---|---|---|---|
| bone_map | – | – | the file's bone names -> this rig's |
| clip | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
load_rig ~55
Loads a rig: the arms on their idle pose, the rifle on the gun bone, its clips. Returns the frames, sign rules, named points, clips and moving parts. Call first.
| Name | Type | Req | Description |
|---|---|---|---|
| rig | string | yes | – |
No output schema declared.
No examples provided.
move_gun ~180
Moves the rifle from where it stands: roll + turns its right side up (about the bore); swing + takes the muzzle left, pitch + the muzzle up (about the pivot); right, forward, up move it in the view, cm. The hands in keep_hands keep their hold. Returns how far each hand ended from its hold and the barrel's angle off the view line.
| Name | Type | Req | Description |
|---|---|---|---|
| forward | number | – | – |
| keep_hands | array | – | hands that keep their hold on the rifle as it moves (arm IK) |
| pitch | number | – | – |
| pivot | – | – | a rig point (stock, bore) or [x, y, z] in the gun frame |
| right | number | – | – |
| roll | number | – | – |
| swing | number | – | – |
| up | number | – | – |
No output schema declared.
No examples provided.
move_part ~44
Draws a moving part of the rifle (such as carrier) back along the barrel, cm from home.
| Name | Type | Req | Description |
|---|---|---|---|
| cm | number | yes | – |
| part | string | yes | – |
No output schema declared.
No examples provided.
pose_clip ~52
The arms as a clip has them at a time in seconds. The rifle follows the gun bone; its parts stay where move_part left them.
| Name | Type | Req | Description |
|---|---|---|---|
| clip | string | yes | – |
| seconds | number | yes | – |
No output schema declared.
No examples provided.
pose_idle ~21
The arms back on the idle pose, every rifle part home.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
reach ~171
Puts a wrist on a point by arm IK; the hand keeps its turn. Returns how far the wrist ended from the point. Trying poles while the wrist stays put moves only the elbow: a way to clear a forearm.
| Name | Type | Req | Description |
|---|---|---|---|
| frame | string | – | gun: the gun bone, cm (+X gun's left, +Y barrel, +Z up); arms: the arms' space, cm; view: from the eye, cm (+X right, +Y forward, +Z up) |
| pole | – | – | where the elbow points, arms frame cm |
| side | string | yes | – |
| target | – | yes | a name (a bone such as hand_l, a fingertip such as index_tip_l, a rig point such as port) or [x, y, z] in the frame |
No output schema declared.
No examples provided.
record_clip ~101
Builds a clip from poses you set: start (a name), key (the current pose at a time in seconds), stop (bakes the frames, each bone eased from key to key). Between keys the bones blend by rotation, so hands can drift off the rifle between keys.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| clip | – | – | – |
| ease | boolean | – | – |
| fps | number | – | – |
| seconds | number | – | – |
No output schema declared.
No examples provided.
render ~63
Renders the pose as one labelled contact sheet: eye is the player's camera (90 degrees, 5 cm near plane); right, left, top and front look at the rifle from outside. Every tile is a Blender view, labelled so.
| Name | Type | Req | Description |
|---|---|---|---|
| views | array | – | – |
No output schema declared.
No examples provided.
retarget_clip ~265
Plays another rig's clip on this rig with one hand held on this gun's own hold (its rest hold, or mark) by arm IK, fingers mended: shared motion, the gun's own grip. keep_from_s..keep_to_s: a span the hand leaves the gun (a reload), kept as the clip has it. Stores the result as out (default <clip>_retarget).
| Name | Type | Req | Description |
|---|---|---|---|
| clip | string | yes | – |
| frame | string | – | gun: the gun bone, cm (+X gun's left, +Y barrel, +Z up); arms: the arms' space, cm; view: from the eye, cm (+X right, +Y forward, +Z up) |
| gun_move | – | – | move_gun's arguments applied to every frame first (the other hand keeps its hold): a rifle carried lower or closer |
| hold | string | – | the rig's idle hold, or the hold it stands in now (after solve_grip) |
| keep_from_s | – | – | – |
| keep_to_s | – | – | – |
| mark | – | – | – |
| out | – | – | – |
| pole | – | – | where the elbow points (arms frame, cm), as solve_grip's best gives it |
| side | string | yes | – |
No output schema declared.
No examples provided.
save_clip ~69
Writes a clip to the output folder's clips/: pose.json bone data, and fbx for a game engine.
| Name | Type | Req | Description |
|---|---|---|---|
| clip | string | yes | – |
| formats | array | – | – |
| root_name | – | – | the armature's name in the FBX (Unreal reads it as the root bone) |
No output schema declared.
No examples provided.
scan_clip ~196
Plays a clip frame by frame and runs each check. Reports for each check whether it passed, the worst value and when, and the time spans where it fails.
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | yes | each {type, ...}: clearance (parts, ignore, max_cm), anatomy (side both|l|r, fingers: the rules broken, counted), grip (side, back_max_cm, palm_max_cm: the hand's wrong-side or too-deep contacts, cou… |
| clip | string | yes | – |
No output schema declared.
No examples provided.
screen ~85
Where a point falls on a 90 degree, 16:9 screen from the eye: x and y from -1 to 1, and whether it is on screen.
| Name | Type | Req | Description |
|---|---|---|---|
| point | – | yes | a name (a bone such as hand_l, a fingertip such as index_tip_l, a rig point such as port) or [x, y, z] in the frame |
No output schema declared.
No examples provided.
shift_hand ~124
Moves one hand frame by frame by the given deltas (gun frame, cm): a hand that holds a part whose track changed follows the part's new path. The hand keeps its turn against the gun, its elbow its direction, its fingers their curl; the wrist and fingers are mended.
| Name | Type | Req | Description |
|---|---|---|---|
| clip | string | yes | – |
| deltas | array | yes | [[seconds, [x, y, z]], ...]: the hand's move in the gun frame (cm), straight lines between |
| out | – | – | – |
| side | string | yes | – |
No output schema declared.
No examples provided.
snapshot ~36
Saves or loads a named pose (the arms and the rifle's parts).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| name | string | yes | – |
No output schema declared.
No examples provided.
solve ~196
Searches rifle moves from the current pose for one meeting every goal, and leaves the scene there. Reports each goal at the best move and how often it was met across samples: a goal never met is a fact of the geometry.
| Name | Type | Req | Description |
|---|---|---|---|
| dofs | object | yes | roll, swing, pitch, right, forward, up -> [min, max] |
| goals | array | yes | each {type: faces_eye|visible (point, min), on_screen (point), clearance (parts, ignore, max_cm), anatomy (side, fingers), grip (side, back_max_cm, palm_max_cm), barrel (max_deg), distance (a, b, max… |
| keep_hands | array | – | hands that keep their hold on the rifle as it moves (arm IK) |
| maximize | – | – | a goal's index to push higher once all are met |
| pivot | string | – | – |
| samples | integer | – | – |
No output schema declared.
No examples provided.
solve_grip ~311
Searches a hand's hold on the rifle: the palm on mark (moved along the barrel), the elbow toward each pole. A hold counts when the palm holds the rifle (grip), nothing clips past clearance_max_cm (ignore: declared contacts), every arm and finger rule holds, and the view stays within view_budget. The nearest hold to the mark that counts wins and the rig is left in it; the table shows what failed where.
| Name | Type | Req | Description |
|---|---|---|---|
| along | array | – | [from_cm, to_cm] along the barrel from the mark |
| clearance_max_cm | number | – | – |
| frame | string | – | gun: the gun bone, cm (+X gun's left, +Y barrel, +Z up); arms: the arms' space, cm; view: from the eye, cm (+X right, +Y forward, +Z up) |
| ignore | array | – | – |
| mark | – | yes | a name (a bone such as hand_l, a fingertip such as index_tip_l, a rig point such as port) or [x, y, z] in the frame |
| poles | – | – | elbow poles, arms frame cm; the idle elbow and four round it if left out |
| rolls | array | – | the hand's roll about the barrel to try, degrees |
| side | string | yes | – |
| steps | integer | – | – |
| view_budget | – | – | {lower_left, bottom_middle}: the most of each third the arms may cover |
No output schema declared.
No examples provided.
turn_bone ~180
Turns one bone by degrees about an axis through its head; the bones below it follow and nothing else moves. Use it to bend or straighten a finger joint, turn a wrist, or turn a whole arm at the shoulder. bone: a bone's name (an unknown name lists them all). The two signs of degrees turn opposite ways. The rifle does not move: use move_gun.
| Name | Type | Req | Description |
|---|---|---|---|
| axis | array | yes | [x, y, z]: the axis's direction in the frame |
| bone | string | yes | – |
| degrees | number | yes | – |
| frame | string | – | gun: the gun bone, cm (+X gun's left, +Y barrel, +Z up); arms: the arms' space, cm; view: from the eye, cm (+X right, +Y forward, +Z up) |
No output schema declared.
No examples provided.
view_cover ~60
The share of the player's view the arms cover (all, its lower left third, its bottom middle third): the arms rendered alone from the eye as a mask. A forearm or sleeve that fills the lower left hides the gun and the world.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
visible ~81
The share of a small disc round a point that the eye sees with nothing (arms, rifle) in the way.
| Name | Type | Req | Description |
|---|---|---|---|
| point | – | – | a name (a bone such as hand_l, a fingertip such as index_tip_l, a rig point such as port) or [x, y, z] in the frame |
| radius_cm | number | – | – |
No output schema declared.
No examples provided.
where ~92
Where bones, fingertips (<finger>_tip_<l|r>) and rig points are, in a frame.
| Name | Type | Req | Description |
|---|---|---|---|
| frame | string | – | gun: the gun bone, cm (+X gun's left, +Y barrel, +Z up); arms: the arms' space, cm; view: from the eye, cm (+X right, +Y forward, +Z up) |
| names | array | yes | – |
No output schema declared.
No examples provided.
How do I install the Pose Lab MCP server?
Pose Lab runs locally as a PyPI package, launched with uvx poselab-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · poselab-mcp
claude mcp add hpdkhoa-poselab-mcp -- uvx poselab-mcp
What is the Pose Lab MCP server?
Pose Lab is an MCP server listed in the public MCP registry as io.github.hpdkhoa/poselab-mcp. Measured spatial answers for posing first-person arms and a rifle in Blender. This page covers its PyPI package (poselab-mcp).
Is the Pose Lab MCP server safe to use?
Pose Lab scores 65 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 16 October 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Pose Lab MCP server expose?
Pose Lab exposes 31 tools: list_rigs, load_rig, describe, pose_idle, pose_clip, and 26 more. Their descriptions and schemas cost roughly 4,340 tokens of context every time the server is loaded.
Is the Pose Lab MCP server still maintained?
Pose Lab is still listed as active in the MCP registry. We last reached this channel on 16 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Pose Lab MCP server under?
Pose Lab declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.