MCP server for PullWeights — search, pull, and push models, datasets, and container images
PullWeights MCP has 7 tools with consistent naming (all verb-noun) and complete input schemas visible in code. Tool descriptions are present and moderately detailed (ranging 50-150 chars, within the 10-1024 baseline). However, descriptions lack strategic guidance on WHEN to use each tool vs. alternatives, and output schemas are not documented, critical for agent planning. Parameter descriptions are present but often minimal (e.g., 'Organization name. Omit to list your orgs.' could explain the authentication requirement more clearly). Error handling is not visible in the tool definitions themselves, and there is no evidence of recovery guidance or actionable error messages. The schemas are well-formed with proper types and enums (search, update, push tools), but the 'ls' and 'tags' tools lack input validation details (e.g., what format is 'org'?). Overall, this is a solid foundation with good naming and schema structure but incomplete descriptions and no documented output structures or error recovery patterns.
Get the manifest for a model version (files, checksums, metadata)
List items in an org (models, datasets, containers), or list your orgs (requires auth)
Download files for a model or dataset to disk with SHA-256 verification
Upload files to PullWeights (two-phase: init, upload to S3, finalize)
Search PullWeights for models, datasets, and container images
List available tags for a model
Update model metadata (description, visibility, framework, license, tags)
Output schemas are not documented. Tools return structured results but LLMs have no way to plan downstream operations. For example, 'search' likely returns a list of results with org/model/tag/downloads, but this is not formally declared. Without documented outputs, agents cannot chain tools or extract required fields reliably.
Error handling and recovery guidance are not visible in tool definitions. When 'update' fails due to insufficient permissions, or 'push' fails due to invalid file paths, there is no documented guidance for what the LLM should do next. Per pattern:recovery-guide, error responses must be actionable.
Tool descriptions lack strategic context. The 'search' description does not explain when to use it vs. 'ls', or what happens when no results are found. Descriptions should answer: WHAT does it do, WHEN to use it, and WHAT happens on success/failure. Current descriptions are purely mechanical.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 62 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
'ls' tool description is ambiguous. It says 'List items in an org... or list your orgs (requires auth)' but does not explain: (1) how does the tool know if auth is required? (2) if org is omitted and user is not authenticated, what happens? (3) can an unauthenticated user list public orgs? Per pattern:tool-description, dependencies must be explicit.
Parameter descriptions are minimal and lack constraints. Example: 'framework' in search is described as 'Filter by framework (e.g. pytorch, gguf, safetensors)' but does not say: are these the only valid values? Can an LLM pass an arbitrary string? The examples suggest an enum but it is not formally declared. Per pattern:constrained-input, free-form strings invite hallucinated values.
No pagination guidance in tool descriptions. The 'search' tool accepts per_page and page parameters but the description does not explain: what is the default page size? Can an LLM assume results fit in one page? If there are 10,000 models matching the query, is pagination mandatory? Per pattern:paginated-result, pagination must be transparent to the agent.
Destructive operations ('push', 'pull', 'update') lack confirmation or dry-run support. Agents make mistakes, 'push' could upload sensitive files to the wrong org. Per pattern:confirmation-request, irreversible operations should support a confirmation step or explicit override flag. Currently, there is no guard.
Model reference parsing (e.g., 'org/model:tag') is documented in parameter descriptions but the error handling is unclear. If an LLM passes 'invalid-ref', what does inspect return? Does it say 'Invalid format: expected org/model or org/model:tag'? Or a generic 500 error? Per pattern:actionable-errors, invalid inputs must return clear guidance.