{"record":{"id":"c709a782aec89563","repo":"microsoft/aspire","slug":"mcp-server-configuration-configname-is-already-registered-on","errorCode":null,"errorMessage":"MCP server configuration '{configName}' is already registered on Connector Namespace '{builder.Resource.Name}'.","messagePattern":"MCP server configuration '(.+?)' is already registered on Connector Namespace '(.+?)'\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Azure.ConnectorNamespace/AzureConnectorNamespaceExtensions.cs","lineNumber":474,"sourceCode":"    /// <param name=\"name\">The Aspire resource name.</param>\n    /// <param name=\"options\">The optional MCP server configuration.</param>\n    /// <returns>A resource builder for the MCP server configuration.</returns>\n    /// <ats-returns>The resource builder.</ats-returns>\n    [AspireExport]\n    public static IResourceBuilder<AzureConnectorNamespaceMcpServerConfigResource> AddMcpServerConfig(\n        this IResourceBuilder<AzureConnectorNamespaceResource> builder,\n        [ResourceName] string name,\n        AzureConnectorNamespaceMcpServerConfigOptions? options = null)\n    {\n        ArgumentNullException.ThrowIfNull(builder);\n        ArgumentException.ThrowIfNullOrWhiteSpace(name);\n\n        var configName = options?.ConfigName ?? name;\n        ValidateConnectorResourceName(configName, nameof(options));\n        if (builder.Resource.McpServerConfigs.Any(config =>\n            string.Equals(config.ConfigName, configName, StringComparison.OrdinalIgnoreCase)))\n        {\n            throw new InvalidOperationException(\n                $\"MCP server configuration '{configName}' is already registered on Connector Namespace '{builder.Resource.Name}'.\");\n        }\n\n        var config = new AzureConnectorNamespaceMcpServerConfigResource(\n            name,\n            configName,\n            options?.Description,\n            builder.Resource);\n        config.Annotations.Add(ManifestPublishingCallbackAnnotation.Ignore);\n        builder.Resource.McpServerConfigs.Add(config);\n        return builder.ApplicationBuilder.AddResource(config);\n    }\n\n    /// <summary>\n    /// Marks a managed MCP server configuration as an existing Azure resource.\n    /// </summary>\n    /// <param name=\"builder\">The MCP server configuration resource builder.</param>\n    /// <returns>The resource builder.</returns>","sourceCodeStart":456,"sourceCodeEnd":492,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Azure.ConnectorNamespace/AzureConnectorNamespaceExtensions.cs#L456-L492","documentation":"AddMcpServerConfig rejects duplicate MCP server configuration names within the same Connector Namespace. Config names are compared case-insensitively (OrdinalIgnoreCase) because they map to case-insensitive resource identifiers in Azure. Duplicate registrations would produce ambiguous or conflicting deployed configuration, so the second registration throws.","triggerScenarios":"Calling AddMcpServerConfig with a name (or options.ConfigName) that case-insensitively matches an already-registered config on the same namespace, e.g. AddMcpServerConfig(\"github\") twice, or \"GitHub\" after \"github\".","commonSituations":"Registering the same MCP server (e.g. GitHub, MCP inspection endpoints) from two extension/helper methods that each call AddMcpServerConfig; copy-pasted builder code using the same name in one namespace.","solutions":["Use a unique name (and unique options.ConfigName) for each AddMcpServerConfig call on the namespace.","Reuse the existing builder returned by the first AddMcpServerConfig call instead of registering again.","Centralize MCP server registration in one place so it cannot be invoked twice with the same name."],"exampleFix":"// before\nns.AddMcpServerConfig(\"github\", githubOptions);\nns.AddMcpServerConfig(\"GitHub\", otherOptions); // throws: case-insensitive duplicate\n\n// after\nvar github = ns.AddMcpServerConfig(\"github\", githubOptions);\n// reuse 'github' builder instead of a second registration","handlingStrategy":"validation","validationCode":"bool alreadyRegistered = ns.Resource.McpServerConfigs.Any(c =>\n    string.Equals(c.ConfigName, configName, StringComparison.OrdinalIgnoreCase));\nif (!alreadyRegistered)\n{\n    ns.AddMcpServerConfig(name, options);\n}","typeGuard":null,"tryCatchPattern":"try\n{\n    var mcp = ns.AddMcpServerConfig(name, options);\n}\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"is already registered\"))\n{\n    // reuse the existing config builder instead of registering again\n}","preventionTips":["Register each MCP server config exactly once; keep the returned builder for reuse.","Remember names are case-insensitive — \"GitHub\" and \"github\" collide.","Centralize MCP config registration in a single helper/extension."],"tags":["azure","aspire-hosting","duplicate-registration","mcp"],"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-21T09:17:21.228Z"}