MCP server for interacting with Quay container registry API, enabling management of organizations, teams, members, and repositories
Server has 5 tools with basic descriptions and input schemas, but significant quality gaps. All tools have descriptions (good), but they are generic and lack actionable guidance for LLM selection. Parameter descriptions are minimal (1-2 words). No output schemas documented. Error handling is absent, make_request() silently returns None on failure with only a print() statement. No enum constraints on visibility parameter despite known valid values. Return types are inconsistent (some return str, some return dict|None). Tools lack idempotency hints and state-modification warnings. No pagination support despite tools returning lists. Naming is acceptable (verb_noun pattern) but descriptions do not explain WHEN to use each tool or what distinguishes similar tools (e.g., get_organization_members vs get_team_members).
Add a user as a member to a specific team within a Quay organization. Args: organization_name (str): The name of the Quay organization. team_name (str): The name of the team within the organization. member_name (str): The username of the member to add. Returns: str: JSON string with the result of the operation.
Create a new repository in the specified Quay organization. Args: organization_name (str): The name of the Quay organization. repository_name (str): The name of the new repository. visibility (str, optional): Repository visibility, either "private" or "public". Defaults to "private". description (str, optional): Description for the repository. Defaults to an empty string. Returns: str: JSON string with the result of the repository creation.
Retrieve the members of a specified Quay organization. Args: organization_name (str): The name of the Quay organization. Returns: str: JSON string containing the list of organization members.
List all repositories under the specified Quay organization. Args: organization_name (str): The name of the Quay organization. Returns: str: JSON string containing the list of repositories.
No output schema documentation. Tools return str or dict|None but LLMs cannot infer response structure. Downstream tool chaining impossible without trial-and-error.
Error handling is silent and non-actionable. make_request() catches all exceptions, prints to stdout, and returns None. LLM receives no guidance on retry, user-fixable issues, or recovery steps.
visibility parameter in create_repository lacks enum constraint. Description says 'either "private" or "public"' but no formal enum in schema. LLM may hallucinate invalid values like 'internal' or 'protected'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
Retrieve the members of a specific team within a Quay organization. Args: organization_name (str): The name of the Quay organization. team_name (str): The name of the team within the organization. Returns: str: JSON string containing the list of team members.
No pagination support. get_organization_members, get_team_members, get_repositories return full lists with no limit, offset, or cursor. Large result sets will exhaust context window.
Descriptions do not clarify state-modification intent. add_team_member and create_repository modify state but descriptions lack explicit 'This creates/modifies...' language. LLM cannot determine idempotency or retry safety.