bear_context_triage
Triage inbox files by moving to external folder, creating a Bear note with context tag, or deleting. Automatically regenerates the index.
Instructions
Triage a file in the inbox. Three actions: 'keep' moves it to external/ with optional group/summary metadata. 'push_to_bear' creates a Bear note tagged #context (+ optional subtag) and deletes the inbox file. 'discard' deletes the file. All actions regenerate the index.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Filename in inbox/ to triage | |
| action | Yes | Triage action: keep (move to external/), push_to_bear (create Bear note), or discard (delete) | |
| group | No | Group label (used with 'keep' action) | |
| subtag | No | Sub-tag for Bear note (used with 'push_to_bear' action, e.g., 'jira' → #context/jira) | |
| summary | No | Short summary (used with 'keep' action) |
Implementation Reference
- mcp-server/src/tools.ts:1041-1082 (schema)Tool definition and input schema for bear_context_triage. Accepts filename (required), action (required, enum: keep/push_to_bear/discard), group, subtag, and summary.
bear_context_triage: { tool: { name: "bear_context_triage", description: "Triage a file in the inbox. Three actions: 'keep' moves it to external/ with optional group/summary metadata. 'push_to_bear' creates a Bear note tagged #context (+ optional subtag) and deletes the inbox file. 'discard' deletes the file. All actions regenerate the index.", inputSchema: { type: "object" as const, properties: { filename: { type: "string", description: "Filename in inbox/ to triage", }, action: { type: "string", enum: ["keep", "push_to_bear", "discard"], description: "Triage action: keep (move to external/), push_to_bear (create Bear note), or discard (delete)", }, group: { type: "string", description: "Group label (used with 'keep' action)", }, subtag: { type: "string", description: "Sub-tag for Bear note (used with 'push_to_bear' action, e.g., 'jira' → #context/jira)", }, summary: { type: "string", description: "Short summary (used with 'keep' action)", }, }, required: ["filename", "action"], }, annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, }, }, - mcp-server/src/tools.ts:1083-1096 (handler)buildArgs function that constructs the command-line arguments to invoke 'bcli context triage' with the filename, action, --json flag, and optional --group, --subtag, --summary flags.
buildArgs: (input) => { const args = [ "context", "triage", String(input.filename), String(input.action), "--json", ]; if (input.group) args.push("--group", String(input.group)); if (input.subtag) args.push("--subtag", String(input.subtag)); if (input.summary) args.push("--summary", String(input.summary)); return args; }, }, - mcp-server/src/tools.ts:1041-1096 (registration)Registration of bear_context_triage in the tools record, mapping the tool definition and buildArgs to the 'bear_context_triage' key.
bear_context_triage: { tool: { name: "bear_context_triage", description: "Triage a file in the inbox. Three actions: 'keep' moves it to external/ with optional group/summary metadata. 'push_to_bear' creates a Bear note tagged #context (+ optional subtag) and deletes the inbox file. 'discard' deletes the file. All actions regenerate the index.", inputSchema: { type: "object" as const, properties: { filename: { type: "string", description: "Filename in inbox/ to triage", }, action: { type: "string", enum: ["keep", "push_to_bear", "discard"], description: "Triage action: keep (move to external/), push_to_bear (create Bear note), or discard (delete)", }, group: { type: "string", description: "Group label (used with 'keep' action)", }, subtag: { type: "string", description: "Sub-tag for Bear note (used with 'push_to_bear' action, e.g., 'jira' → #context/jira)", }, summary: { type: "string", description: "Short summary (used with 'keep' action)", }, }, required: ["filename", "action"], }, annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, }, }, buildArgs: (input) => { const args = [ "context", "triage", String(input.filename), String(input.action), "--json", ]; if (input.group) args.push("--group", String(input.group)); if (input.subtag) args.push("--subtag", String(input.subtag)); if (input.summary) args.push("--summary", String(input.summary)); return args; }, }, - mcp-server/src/index.ts:33-121 (registration)CallToolRequestSchema handler that looks up the tool by name, calls handler.buildArgs(params), and executes via execBcliWithReauth or execBcliWithStdinAndReauth.
server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: input } = request.params; const handler = tools[name]; if (!handler) { return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true, }; } const params = (input ?? {}) as Record<string, unknown>; // Validate bear_edit_note: need at least one edit operation if (name === "bear_edit_note") { const hasAppend = params.append_text !== undefined; const hasBody = params.body !== undefined; const hasSetFm = params.set_frontmatter !== undefined && Object.keys(params.set_frontmatter as object).length > 0; const hasRemoveFm = Array.isArray(params.remove_frontmatter) && (params.remove_frontmatter as unknown[]).length > 0; const hasFm = hasSetFm || hasRemoveFm; if (!hasAppend && !hasBody && !hasFm) { return { content: [ { type: "text", text: "Provide 'append_text', 'body', 'set_frontmatter', or 'remove_frontmatter'.", }, ], isError: true, }; } if (hasAppend && hasBody) { return { content: [ { type: "text", text: "Provide either 'append_text' or 'body', not both.", }, ], isError: true, }; } } try { const args = handler.buildArgs(params); let result: { stdout: string; stderr: string }; // Check if this tool needs stdin piping const stdinData = handler.usesStdin?.(params) ?? null; if (stdinData !== null) { result = await execBcliWithStdinAndReauth(args, stdinData); } else { result = await execBcliWithReauth(args); } // Parse JSON output from bcli const stdout = result.stdout.trim(); if (!stdout) { return { content: [{ type: "text", text: "Command completed successfully." }], }; } // Validate it's JSON and pretty-print try { const parsed = JSON.parse(stdout); return { content: [ { type: "text", text: JSON.stringify(parsed, null, 2) }, ], }; } catch { // If bcli returned non-JSON, pass it through return { content: [{ type: "text", text: stdout }], }; } } catch (error) { const message = error instanceof BcliError ? error.message : String(error); return { content: [{ type: "text", text: message }], isError: true, }; }