{"record":{"id":"b3b0309fc6bfc4c4","repo":"vercel/ai","slug":"acp-mcp-server-name-ai-sdk-harness-tools-is-rese-b3b030","errorCode":null,"errorMessage":"ACP MCP server name \"ai-sdk-harness-tools\" is reserved for HarnessAgent tools.","messagePattern":"ACP MCP server name \"ai-sdk-harness-tools\" is reserved for HarnessAgent tools\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/harness-acp/src/v1/acp-v1-harness.ts","lineNumber":153,"sourceCode":"    HarnessV1<TBuiltinTools>['lifecycleStateSchema']\n  >;\n}): HarnessV1<TBuiltinTools> {\n  if (\n    (settings.credentialEnv == null) !==\n    (settings.credentialBrokering == null)\n  ) {\n    throw new Error(\n      'ACP credentialEnv and credentialBrokering must be configured together.',\n    );\n  }\n  if (\n    settings.mcpServers != null &&\n    Object.prototype.hasOwnProperty.call(\n      settings.mcpServers,\n      'ai-sdk-harness-tools',\n    )\n  ) {\n    throw new Error(\n      'ACP MCP server name \"ai-sdk-harness-tools\" is reserved for HarnessAgent tools.',\n    );\n  }\n  if (!HARNESS_ID_REGEXP.test(settings.harnessId)) {\n    throw new Error(\n      `ACP harnessId must be a stable kebab-case identifier; received ${JSON.stringify(settings.harnessId)}.`,\n    );\n  }\n  const implementation = createACPV1Implementation({ settings });\n  validateACPV1Implementation(implementation);\n  const bootstrap = createACPBootstrap({\n    harnessId: settings.harnessId,\n    implementation,\n  });\n  const permissionModeMapping = isCompletePermissionModeMapping({\n    value: settings.permissionModeMapping,\n  })\n    ? settings.permissionModeMapping","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/vercel/ai/blob/69428b1f8b037e4d118fb4853428d5c4e620493c/packages/harness-acp/src/v1/acp-v1-harness.ts#L135-L171","documentation":"createACPV1 rejects an MCP server registered under the key \"ai-sdk-harness-tools\" because that name is reserved for the harness's internal HarnessAgent tool server. Allowing it would shadow or collide with the built-in tools exposed over that channel, so the conflict is caught during harness construction.","triggerScenarios":"Calling createACP/createACPV1 with settings.mcpServers containing the key 'ai-sdk-harness-tools'.","commonSituations":"Template or generated MCP configs that happen to use the reserved key; users reading internal docs that reference the harness tool server and assuming it is user-configurable.","solutions":["Rename the MCP server key to something else.","Remove the entry if its tools duplicate built-in HarnessAgent tools already enabled via builtinTools.","Grep config sources for 'ai-sdk-harness-tools' and eliminate user-supplied occurrences."],"exampleFix":"// before\ncreateACP({ mcpServers: { 'ai-sdk-harness-tools': { url: 'http://localhost:3001' } } }); // throws\n// after\ncreateACP({ mcpServers: { 'app-tools': { url: 'http://localhost:3001' } } });","handlingStrategy":"validation","validationCode":"function validateMcpServerNames(mcpServers?: Record<string, unknown>): void {\n  if (mcpServers != null && 'ai-sdk-harness-tools' in mcpServers) {\n    throw new Error('MCP server name \"ai-sdk-harness-tools\" is reserved.');\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use a distinct naming convention for user MCP servers.","Run this name check before calling createACP in config-heavy codepaths.","Expose built-in tools via builtinTools rather than a same-named MCP server."],"tags":["configuration","mcp","naming-conflict"],"backgroundTag":"reserved-identifier-conflict","analyzedSha":"69428b1f8b037e4d118fb4853428d5c4e620493c","analyzedAt":"2026-08-30T12:32:21.016Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}