{"record":{"id":"a044a176309510c6","repo":"agentscope-ai/agentscope","slug":"mcp-card-name-r-needs-a-value-for-join-so","errorCode":null,"errorMessage":"MCP {card.name!r} needs a value for: {', '.join(sorted(missing))}","messagePattern":"MCP (.+?) needs a value for: (.+?)","errorType":"exception","errorClass":"MCPRenderError","httpStatus":null,"severity":"error","filePath":"src/agentscope/app/_service/_mcp_render.py","lineNumber":154,"sourceCode":"    declared = set(card.inputs_schema.get(\"properties\", {}))\n    required = set(card.inputs_schema.get(\"required\", []))\n    missing: set[str] = set()\n    config_template = card.config_template.model_dump(mode=\"json\")\n    _omit_unfilled_optional_env(\n        config_template,\n        values,\n        declared,\n        required,\n    )\n    config = _substitute(\n        config_template,\n        values,\n        declared,\n        missing,\n    )\n\n    if missing:\n        raise MCPRenderError(\n            f\"MCP {card.name!r} needs a value for: \"\n            f\"{', '.join(sorted(missing))}\",\n        )\n\n    try:\n        return MCPClient(\n            name=name or card.name,\n            is_stateful=card.is_stateful,\n            mcp_config=config,\n        )\n    except ValueError as e:\n        raise MCPRenderError(\n            f\"MCP {card.name!r} produced an invalid client: {e}\",\n        ) from e\n","sourceCodeStart":136,"sourceCodeEnd":169,"githubUrl":"https://github.com/agentscope-ai/agentscope/blob/e90f1c7592896cc95f6e5ee506194f533378247d/src/agentscope/app/_service/_mcp_render.py#L136-L169","documentation":"After schema validation passes, render_mcp checks that every required input in card.inputs_schema has a non-missing effective value; if any are missing it raises MCPRenderError listing them. This catches required fields that were simply omitted from the values dict.","triggerScenarios":"Calling install_mcp/update_mcp without supplying all required inputs declared in the card's required array — e.g. forgetting an API key or endpoint input that has no default.","commonSituations":"New version of an MCP card marks previously-optional inputs as required; UI form not rendering every required field; automations built against an older card schema omitting newly required values.","solutions":["Read the error message — it lists exactly which inputs are missing — and supply those values","Check card.inputs_schema['required'] and provide every listed key","Pin the MCP card version if the schema changed unexpectedly","Pre-fill defaults from the schema where available"],"exampleFix":"# before\nclient = render_mcp(card, values={\"url\": \"https://api.example.com\"})\n# after — 'token' was required\nclient = render_mcp(card, values={\"url\": \"https://api.example.com\", \"token\": os.environ[\"MCP_TOKEN\"]})","handlingStrategy":"validation","validationCode":"required = set(card.inputs_schema.get(\"required\", []))\nmissing = required - {k for k, v in values.items() if v not in (None, \"\")}\nif missing:\n    raise ValueError(f\"missing required MCP inputs: {sorted(missing)}\")","typeGuard":"def has_all_required(values: dict, schema: dict) -> bool:\n    req = set(schema.get(\"required\", []))\n    return req <= {k for k, v in values.items() if v not in (None, \"\")}","tryCatchPattern":"try:\n    client = render_mcp(card, values)\nexcept MCPRenderError as e:\n    msg = e.args[0]\n    if msg.startswith(\"MCP\") and \"needs a value for\" in msg:\n        missing = msg.rsplit(\":\", 1)[1].split(\",\")\n        # prompt user for those inputs\n        ...","preventionTips":["Pre-fill defaults from card.inputs_schema before submission","Diff required lists when upgrading MCP cards","Never submit empty strings for required secret inputs"],"tags":["mcp","required-inputs","validation","render"],"backgroundTag":"missing-required-field","analyzedSha":"e90f1c7592896cc95f6e5ee506194f533378247d","analyzedAt":"2026-08-28T18:24:12.087Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}