Create Harm
create_harmCreate a new harm item in a Codebeamer Harms List tracker. Set the IMDRF code and severity level (1–5) to document potential harms.
Instructions
Create a new item in a Codebeamer RM Harms List tracker. Supports setting the IMDRF code (text) and Severity (integer 1–5). Use list_trackers to find the Harms List tracker ID for your project.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | Numeric tracker ID of the RM Harms List tracker | |
| name | Yes | Harm name / summary | |
| description | No | Harm description (plain text or wiki markup) | |
| imdrfCode | No | IMDRF code for this harm (e.g. 'E0001') | |
| severity | No | Severity level (integer 1–5) | |
| parentId | No | Parent item ID to nest this harm inside (e.g. a folder) |
Implementation Reference
- src/tools/risk-write.ts:48-67 (handler)The async handler function that executes the 'create_harm' tool logic. It builds customFields for IMDRF code (fieldId 10000) and severity (fieldId 10001), then calls client.createItem() and formats the result.
async ({ trackerId, name, description, imdrfCode, severity, parentId }) => { const customFields: Array<{ fieldId: number; type: string; value: unknown }> = []; if (imdrfCode !== undefined) { customFields.push({ fieldId: 10000, type: "TextFieldValue", value: imdrfCode }); } if (severity !== undefined) { customFields.push({ fieldId: 10001, type: "IntegerFieldValue", value: severity }); } const data = { name, ...(description !== undefined ? { description } : {}), ...(customFields.length > 0 ? { customFields } : {}), }; const item = await client.createItem(trackerId, data, parentId); return { content: [{ type: "text", text: formatItem(item) }] }; }, ); - src/tools/risk-write.ts:18-46 (schema)Input schema for 'create_harm' using Zod: trackerId (positive int), name (required string), description (optional), imdrfCode (optional string), severity (optional int 1-5), parentId (optional positive int).
inputSchema: { trackerId: z .number() .int() .positive() .describe("Numeric tracker ID of the RM Harms List tracker"), name: z.string().min(1).describe("Harm name / summary"), description: z .string() .optional() .describe("Harm description (plain text or wiki markup)"), imdrfCode: z .string() .optional() .describe("IMDRF code for this harm (e.g. 'E0001')"), severity: z .number() .int() .min(1) .max(5) .optional() .describe("Severity level (integer 1–5)"), parentId: z .number() .int() .positive() .optional() .describe("Parent item ID to nest this harm inside (e.g. a folder)"), }, - src/tools/risk-write.ts:6-68 (registration)Registration of the tool named 'create_harm' via server.registerTool() inside registerRiskWriteTools().
export function registerRiskWriteTools( server: McpServer, client: CodebeamerClient, ): void { server.registerTool( "create_harm", { title: "Create Harm", description: "Create a new item in a Codebeamer RM Harms List tracker. " + "Supports setting the IMDRF code (text) and Severity (integer 1–5). " + "Use list_trackers to find the Harms List tracker ID for your project.", inputSchema: { trackerId: z .number() .int() .positive() .describe("Numeric tracker ID of the RM Harms List tracker"), name: z.string().min(1).describe("Harm name / summary"), description: z .string() .optional() .describe("Harm description (plain text or wiki markup)"), imdrfCode: z .string() .optional() .describe("IMDRF code for this harm (e.g. 'E0001')"), severity: z .number() .int() .min(1) .max(5) .optional() .describe("Severity level (integer 1–5)"), parentId: z .number() .int() .positive() .optional() .describe("Parent item ID to nest this harm inside (e.g. a folder)"), }, }, async ({ trackerId, name, description, imdrfCode, severity, parentId }) => { const customFields: Array<{ fieldId: number; type: string; value: unknown }> = []; if (imdrfCode !== undefined) { customFields.push({ fieldId: 10000, type: "TextFieldValue", value: imdrfCode }); } if (severity !== undefined) { customFields.push({ fieldId: 10001, type: "IntegerFieldValue", value: severity }); } const data = { name, ...(description !== undefined ? { description } : {}), ...(customFields.length > 0 ? { customFields } : {}), }; const item = await client.createItem(trackerId, data, parentId); return { content: [{ type: "text", text: formatItem(item) }] }; }, ); } - src/index.ts:38-50 (registration)Top-level registration call: registerRiskWriteTools(server, client) wires the tool into the MCP server.
registerProjectTools(server, client); registerTrackerTools(server, client); registerItemTools(server, client); registerItemDetailTools(server, client); registerUserTools(server, client); registerItemWriteTools(server, client); registerCommentWriteTools(server, client); registerAssociationWriteTools(server, client); registerRiskWriteTools(server, client); const transport = new StdioServerTransport(); await server.connect(transport); - The createItem() method on CodebeamerClient that posts to /trackers/{trackerId}/items, used by the 'create_harm' handler.
createItem(trackerId: number, data: CbCreateItemRequest, parentId?: number): Promise<CbItem> { return this.http.post(`/trackers/${trackerId}/items`, { params: parentId !== undefined ? { parentItemId: parentId } : undefined, body: data, resource: `create item in tracker ${trackerId}`, }); }