{"record":{"id":"baa0cc4b282a9781","repo":"different-ai/openwork","slug":"invalid-mcp-token-payload","errorCode":"invalid_mcp_token_payload","errorMessage":"MCP token response was missing required values.","messagePattern":"MCP token response was missing required values\\.","errorType":"error_code","errorClass":"DenApiError","httpStatus":500,"severity":"error","filePath":"apps/app/src/app/lib/den.ts","lineNumber":3100,"sourceCode":"      });\n      // 404 means the memory is already gone (or not owned) — idempotent from the caller's view.\n      if (!result.ok && result.status !== 404) {\n        const payload = result.json;\n        const code = isRecord(payload) && typeof payload.error === \"string\" ? payload.error : \"request_failed\";\n        throw new DenApiError(result.status, code, getErrorMessage(payload, `Delete failed with ${result.status}.`));\n      }\n    },\n\n    async mintMcpToken(orgId: string): Promise<DenMcpToken> {\n      const payload = await requestJson<unknown>(baseUrls, \"/v1/mcp/token\", {\n        method: \"POST\",\n        token,\n        organizationId: orgId,\n        body: { scopes: [\"mcp:read\", \"mcp:write\"] },\n      });\n      const minted = parseDenMcpToken(payload);\n      if (!minted) {\n        throw new DenApiError(500, \"invalid_mcp_token_payload\", \"MCP token response was missing required values.\");\n      }\n      return minted;\n    },\n\n    async getWorkerTokens(workerId: string, orgId: string): Promise<DenWorkerTokens> {\n      const payload = await requestJson<unknown>(baseUrls, `/v1/workers/${encodeURIComponent(workerId)}/tokens`, {\n        method: \"POST\",\n        token,\n        organizationId: orgId,\n        body: {},\n      });\n      const tokens = getWorkerTokens(payload);\n      if (!tokens) {\n        throw new DenApiError(500, \"invalid_worker_token_payload\", \"Worker token response was missing token values.\");\n      }\n      return tokens;\n    },\n","sourceCodeStart":3082,"sourceCodeEnd":3118,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/apps/app/src/app/lib/den.ts#L3082-L3118","documentation":"mintMcpToken POSTs to /v1/mcp/token requesting mcp:read and mcp:write scopes, then parses the payload with parseDenMcpToken. If the response is missing required token values, a 500 DenApiError with code \"invalid_mcp_token_payload\" is thrown so callers never receive a partially-formed MCP token.","triggerScenarios":"The mint endpoint returns 2xx but the body lacks the expected token fields — server schema drift, wrong server, or a proxy altering the response.","commonSituations":"Self-hosted Den version without full MCP token support, server-side minting failure swallowed into a 2xx, or misconfigured baseUrl.","solutions":["Verify the Den server version supports MCP token minting with the expected response shape","Log the raw payload to identify the missing field","Re-authenticate and retry if the failure could be session-related","Fix baseUrl/proxy configuration so the real Den server responds"],"exampleFix":"// before\nconst token = await client.mintMcpToken(orgId);\nconnectMcp(token);\n// after\ntry { connectMcp(await client.mintMcpToken(orgId)); }\ncatch (err) {\n  if (err instanceof DenApiError && err.code === \"invalid_mcp_token_payload\") throw new Error(\"MCP token unavailable on this Den server\");\n  throw err;\n}","handlingStrategy":"type-guard","validationCode":"if (!orgId) throw new Error(\"An organization id is required to mint an MCP token\");","typeGuard":"const isDenMcpToken = (t: unknown): t is DenMcpToken =>\n  typeof t === \"object\" && t !== null && \"token\" in t && typeof (t as { token: unknown }).token === \"string\" && (t as { token: string }).token.length > 0;","tryCatchPattern":"try {\n  mcpToken = await client.mintMcpToken(orgId);\n} catch (err) {\n  if (err instanceof DenApiError && err.code === \"invalid_mcp_token_payload\") {\n    throw new Error(\"This Den server cannot mint MCP tokens; upgrade the server\");\n  } else throw err;\n}","preventionTips":["Confirm the Den server supports MCP token minting before wiring the flow","Validate the minted token is a non-empty string before storing it","Re-mint rather than cache tokens across sessions"],"tags":["schema-validation","mcp","den-cloud","api"],"backgroundTag":"schema-validation-failed","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}