multica-ai/multica · error

list members: %w

Error message

list members: %w

What it means

Wrapped failure of the HTTP GET to /api/workspaces/{id}/members performed by `multica workspace members`. Chained causes: 404 unknown workspace, 401/403 bad token or insufficient role (member listing is often restricted to admins/owners), or network/server errors.

Source

Thrown at server/cmd/multica/cmd_workspace.go:805

	wsID, err := resolveWorkspaceArg(cmd, args)
	if err != nil {
		return err
	}
	if wsID == "" {
		return fmt.Errorf("workspace ID is required: pass an id/slug/prefix as argument or set MULTICA_WORKSPACE_ID")
	}

	client, err := newAPIClient(cmd)
	if err != nil {
		return err
	}

	ctx, cancel := cli.APIContext(context.Background())
	defer cancel()

	var members []map[string]any
	if err := client.GetJSON(ctx, "/api/workspaces/"+wsID+"/members", &members); err != nil {
		return fmt.Errorf("list members: %w", err)
	}

	output, _ := cmd.Flags().GetString("output")
	if output == "json" {
		return cli.PrintJSON(os.Stdout, members)
	}

	headers := []string{"USER ID", "NAME", "EMAIL", "ROLE"}
	rows := make([][]string, 0, len(members))
	for _, m := range members {
		rows = append(rows, []string{
			strVal(m, "user_id"),
			strVal(m, "name"),
			strVal(m, "email"),
			strVal(m, "role"),
		})
	}
	cli.PrintTable(os.Stdout, headers, rows)

View on GitHub (pinned to 2c0912b6ec)

Solutions

  1. Confirm the workspace resolves: `multica workspace get <ws>`
  2. Check the wrapped status: 403 means the token's role cannot list members — switch to an admin/owner token
  3. Fix base URL/network configuration and retry

Example fix

# before
multica workspace members acme
# list members: 403

# after (use an owner-scoped token)
MULTICA_API_TOKEN=$OWNER_TOKEN multica workspace members acme
Defensive patterns

Strategy: try-catch

Validate before calling

if wsID == "" {
    return errors.New("workspace ID is required")
}

Try / catch

if err := client.GetJSON(ctx, "/api/workspaces/"+wsID+"/members", &members); err != nil {
    var httpErr *apiclient.HTTPError
    if errors.As(err, &httpErr) {
        switch httpErr.StatusCode {
        case 403:
            return fmt.Errorf("token lacks permission to list members of %s", wsID)
        case 404:
            return fmt.Errorf("workspace %s not found", wsID)
        }
    }
    return fmt.Errorf("list members: %w", err)
}

Prevention

When it happens

Trigger: Listing members of a nonexistent id/slug/prefix; authenticating as a role not permitted to enumerate members; server unreachable.

Common situations: Stale slug after rename; bot token with limited scopes; pointing at the wrong environment's base URL.

Related errors


AI-assisted analysis of multica-ai/multica@2c0912b6ec (2026-08-15). Data as JSON: /api/errors/7ed83e4a4cbf022b. Report an issue: GitHub.