{"record":{"id":"f4e231c57abf7862","repo":"microsoft/aspire","slug":"access-policy-resource-name-is-already-registered-on-mcp","errorCode":null,"errorMessage":"Access policy resource '{name}' is already registered on MCP server configuration '{config.Name}'.","messagePattern":"Access policy resource '(.+?)' is already registered on MCP server configuration '(.+?)'\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Azure.ConnectorNamespace/AzureConnectorNamespaceExtensions.cs","lineNumber":697,"sourceCode":"                $\"Access policy '{policyName}' is already registered on connector connection '{connection.Name}'.\");\n        }\n\n        return resourceName;\n    }\n\n    private static string GetValidatedMcpAccessPolicyResourceName(\n        AzureConnectorNamespaceMcpServerConfigResource config,\n        string name,\n        string objectId)\n    {\n        var resourceName = ConnectorNamespaceBicepIdentifiers.CreateMcpAccessPolicy(\n            config.Parent.Name,\n            config.Name,\n            name);\n        if (config.AccessPolicies.Any(policy =>\n            string.Equals(policy.BicepIdentifier, resourceName, StringComparison.OrdinalIgnoreCase)))\n        {\n            throw new InvalidOperationException(\n                $\"Access policy resource '{name}' is already registered on MCP server configuration '{config.Name}'.\");\n        }\n\n        if (config.AccessPolicies.Any(policy =>\n            string.Equals(policy.ObjectId, objectId, StringComparison.OrdinalIgnoreCase)))\n        {\n            throw new InvalidOperationException(\n                $\"An access policy for principal '{objectId}' is already registered on MCP server configuration '{config.Name}'.\");\n        }\n\n        return resourceName;\n    }\n\n    private static void ValidateMcpAccessPolicyOptions(AzureConnectorNamespaceMcpAccessPolicyOptions options)\n    {\n        ValidateEntraPrincipalIds(\n            options.ObjectId,\n            options.TenantId,","sourceCodeStart":679,"sourceCodeEnd":715,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Azure.ConnectorNamespace/AzureConnectorNamespaceExtensions.cs#L679-L715","documentation":"Access policies on an MCP server configuration must have unique Bicep identifiers. GetValidatedMcpAccessPolicyResourceName throws this InvalidOperationException when a policy with the same resource name (case-insensitive) is already registered on the configuration.","triggerScenarios":"Calling WithAccessPolicy twice on the same MCP server configuration with the same resource name argument.","commonSituations":"Repeated configuration of the same policy through shared extension helpers; duplicating builder wiring for multiple environments in one AppHost; case-only differences in names.","solutions":["Pass a different resource name for the new policy.","Remove the duplicate WithAccessPolicy call on the configuration.","Check config.AccessPolicies before adding to skip existing names."],"exampleFix":"// before\nconfig.WithAccessPolicy(\"reader\", objectId, tenantId, PrincipalType.User);\nconfig.WithAccessPolicy(\"reader\", objectId2, tenantId2, PrincipalType.User);\n// after\nconfig.WithAccessPolicy(\"reader\", objectId, tenantId, PrincipalType.User);\nconfig.WithAccessPolicy(\"reader2\", objectId2, tenantId2, PrincipalType.User);","handlingStrategy":"validation","validationCode":"if (config.AccessPolicies.Any(p => string.Equals(p.BicepIdentifier, name, StringComparison.OrdinalIgnoreCase)))\n{\n    // skip or rename before calling WithAccessPolicy on the MCP configuration\n}","typeGuard":null,"tryCatchPattern":"try { config.WithAccessPolicy(name, objectId, tenantId, principalType); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"already registered\"))\n{\n    // use a different resource name or skip\n}","preventionTips":["Keep a registry of policy names per MCP configuration.","Ensure configuration code is idempotent (safe to re-run).","Avoid case-only name variants."],"tags":["azure","mcp","access-policy","duplicate"],"backgroundTag":"file-already-exists","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}