@bragduck/mcp 1.5.4 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,12 +4,15 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
4
4
  import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
5
5
  import { loginTool, handleLogin } from './tools/login.js';
6
6
  import { logBragTool, handleLogBrag } from './tools/log-brag.js';
7
+ import { quickBragTool, handleQuickBrag } from './tools/quick-brag.js';
7
8
  import { handlePreviewBrag } from './tools/preview-brag.js';
8
9
  import { listBragsTool, handleListBrags } from './tools/list-brags.js';
9
10
  import { listObjectivesTool, handleListObjectives } from './tools/list-objectives.js';
10
- import { linkBragToGoalTool, handleLinkBragToGoal } from './tools/link-brag-to-goal.js';
11
+ import { linkBragToKeyResultTool, handleLinkBragToKeyResult } from './tools/link-brag-to-key-result.js';
11
12
  import { listOrganisationsTool, handleListOrganisations } from './tools/list-organisations.js';
12
13
  import { saveOrgPreferenceTool, handleSaveOrgPreference } from './tools/save-org-preference.js';
14
+ import { logStoryTool, handleLogStory } from './tools/log-story.js';
15
+ import { listStoriesTool, handleListStories } from './tools/list-stories.js';
13
16
  const server = new Server({
14
17
  name: 'bragduck',
15
18
  version: '1.0.0',
@@ -70,6 +73,20 @@ const server = new Server({
70
73
  'STEP 4 — DONE\n' +
71
74
  'Once log_brag is allowed and succeeds, confirm with one short sentence.\n' +
72
75
  '\n' +
76
+ 'QUICK BRAG (via /brag or raw text)\n' +
77
+ 'When the user says "/brag" followed by text, or pastes a long block of text and asks to log it, ' +
78
+ 'use the quick_brag tool instead of the interview flow. ' +
79
+ 'quick_brag accepts raw text and uses AI to extract and structure it into a proper brag automatically. ' +
80
+ 'Skip the interview, skip the preview table — just call quick_brag with the text.\n' +
81
+ '\n' +
82
+ 'INTERVIEW STORIES (log_story)\n' +
83
+ 'When the user discusses interview prep, behavioral questions, or asks to save a STAR story, ' +
84
+ 'use log_story instead of log_brag. Stories are structured with Situation/Task/Action/Result fields ' +
85
+ 'and competency tags. Follow the same org-selection flow (list_organisations → saved preference or ask). ' +
86
+ 'Preview the story as a markdown table (Field | Value) before calling log_story in the same response.\n' +
87
+ 'Use list_stories to browse existing stories. Supports filters: category, orgId, search, limit. ' +
88
+ 'Stories include AI-generated strength and impact scores.\n' +
89
+ '\n' +
73
90
  'GENERAL RULES\n' +
74
91
  '- Never fabricate details, metrics, or links. If unsure, ask.\n' +
75
92
  '- "Is this bragable?" deserves a direct honest answer — not a tool call.\n' +
@@ -77,7 +94,7 @@ const server = new Server({
77
94
  });
78
95
  server.setRequestHandler(ListToolsRequestSchema, async () => {
79
96
  return {
80
- tools: [loginTool, logBragTool, listBragsTool, listObjectivesTool, linkBragToGoalTool, listOrganisationsTool, saveOrgPreferenceTool],
97
+ tools: [loginTool, logBragTool, quickBragTool, listBragsTool, listObjectivesTool, linkBragToKeyResultTool, listOrganisationsTool, saveOrgPreferenceTool, logStoryTool, listStoriesTool],
81
98
  };
82
99
  });
83
100
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
@@ -89,16 +106,22 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
89
106
  return handlePreviewBrag(args);
90
107
  case 'log_brag':
91
108
  return handleLogBrag(args);
109
+ case 'quick_brag':
110
+ return handleQuickBrag(args);
92
111
  case 'list_brags':
93
112
  return handleListBrags(args);
94
113
  case 'list_objectives':
95
114
  return handleListObjectives();
96
- case 'link_brag_to_goal':
97
- return handleLinkBragToGoal(args);
115
+ case 'link_brag_to_key_result':
116
+ return handleLinkBragToKeyResult(args);
98
117
  case 'list_organisations':
99
118
  return handleListOrganisations();
100
119
  case 'save_org_preference':
101
120
  return handleSaveOrgPreference(args);
121
+ case 'log_story':
122
+ return handleLogStory(args);
123
+ case 'list_stories':
124
+ return handleListStories(args);
102
125
  default:
103
126
  throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
104
127
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export declare const linkBragToGoalTool: {
1
+ export declare const linkBragToKeyResultTool: {
2
2
  name: string;
3
3
  description: string;
4
4
  inputSchema: {
@@ -8,7 +8,7 @@ export declare const linkBragToGoalTool: {
8
8
  type: string;
9
9
  description: string;
10
10
  };
11
- goalId: {
11
+ keyResultId: {
12
12
  type: string;
13
13
  description: string;
14
14
  };
@@ -18,9 +18,9 @@ export declare const linkBragToGoalTool: {
18
18
  };
19
19
  interface LinkBragInput {
20
20
  bragId: string;
21
- goalId: string;
21
+ keyResultId: string;
22
22
  }
23
- export declare function handleLinkBragToGoal(input: LinkBragInput): Promise<{
23
+ export declare function handleLinkBragToKeyResult(input: LinkBragInput): Promise<{
24
24
  content: Array<{
25
25
  type: string;
26
26
  text: string;
@@ -1,9 +1,9 @@
1
1
  import { apiRequest, requirePaidPlan } from '../api-client.js';
2
2
  import { getUserInfo } from '../credentials.js';
3
- export const linkBragToGoalTool = {
4
- name: 'link_brag_to_goal',
5
- description: 'Add a goal/key-result to a brag (supports multiple goals per brag). ' +
6
- 'Use list_objectives to find goal IDs and list_brags to find brag IDs.',
3
+ export const linkBragToKeyResultTool = {
4
+ name: 'link_brag_to_key_result',
5
+ description: 'Add a keyResult/key-result to a brag (supports multiple keyResults per brag). ' +
6
+ 'Use list_objectives to find keyResult IDs and list_brags to find brag IDs.',
7
7
  inputSchema: {
8
8
  type: 'object',
9
9
  properties: {
@@ -11,15 +11,15 @@ export const linkBragToGoalTool = {
11
11
  type: 'string',
12
12
  description: 'The ID of the brag to update',
13
13
  },
14
- goalId: {
14
+ keyResultId: {
15
15
  type: 'string',
16
- description: 'The ID of the goal to link the brag to',
16
+ description: 'The ID of the keyResult to link the brag to',
17
17
  },
18
18
  },
19
- required: ['bragId', 'goalId'],
19
+ required: ['bragId', 'keyResultId'],
20
20
  },
21
21
  };
22
- export async function handleLinkBragToGoal(input) {
22
+ export async function handleLinkBragToKeyResult(input) {
23
23
  const planError = await requirePaidPlan();
24
24
  if (planError)
25
25
  return planError;
@@ -34,28 +34,28 @@ export async function handleLinkBragToGoal(input) {
34
34
  isError: true,
35
35
  };
36
36
  }
37
- // Fetch current brag to read existing goalIds
37
+ // Fetch current brag to read existing keyResultIds
38
38
  const currentBrag = await apiRequest(`/v1/users/${userInfo.id}/brags/${input.bragId}`);
39
- const existingGoalIds = currentBrag.goalIds || [];
39
+ const existingKeyResultIds = currentBrag.keyResultIds || [];
40
40
  // Skip if already linked
41
- if (existingGoalIds.includes(input.goalId)) {
41
+ if (existingKeyResultIds.includes(input.keyResultId)) {
42
42
  return {
43
43
  content: [{
44
44
  type: 'text',
45
- text: `Brag ${input.bragId} is already linked to goal ${input.goalId}.`,
45
+ text: `Brag ${input.bragId} is already linked to keyResult ${input.keyResultId}.`,
46
46
  }],
47
47
  };
48
48
  }
49
- // Append new goal (deduplicated via the check above)
50
- const updatedGoalIds = [...existingGoalIds, input.goalId];
49
+ // Append new keyResult (deduplicated via the check above)
50
+ const updatedKeyResultIds = [...existingKeyResultIds, input.keyResultId];
51
51
  await apiRequest(`/v1/users/${userInfo.id}/brags/${input.bragId}`, {
52
52
  method: 'PATCH',
53
- body: { goalIds: updatedGoalIds },
53
+ body: { keyResultIds: updatedKeyResultIds },
54
54
  });
55
55
  return {
56
56
  content: [{
57
57
  type: 'text',
58
- text: `Goal ${input.goalId} added to brag ${input.bragId} (now linked to ${updatedGoalIds.length} goal${updatedGoalIds.length === 1 ? '' : 's'}).`,
58
+ text: `KeyResult ${input.keyResultId} added to brag ${input.bragId} (now linked to ${updatedKeyResultIds.length} keyResult${updatedKeyResultIds.length === 1 ? '' : 's'}).`,
59
59
  }],
60
60
  };
61
61
  }
@@ -72,10 +72,10 @@ export async function handleLinkBragToGoal(input) {
72
72
  return {
73
73
  content: [{
74
74
  type: 'text',
75
- text: `Failed to link brag to goal: ${error instanceof Error ? error.message : String(error)}`,
75
+ text: `Failed to link brag to keyResult: ${error instanceof Error ? error.message : String(error)}`,
76
76
  }],
77
77
  isError: true,
78
78
  };
79
79
  }
80
80
  }
81
- //# sourceMappingURL=link-brag-to-goal.js.map
81
+ //# sourceMappingURL=link-brag-to-key-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-brag-to-key-result.js","sourceRoot":"","sources":["../../src/tools/link-brag-to-key-result.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { apiRequest, requirePaidPlan } from '../api-client.js';
2
2
  export const listBragsTool = {
3
3
  name: 'list_brags',
4
4
  description: 'List recent brags (career achievements) from BragDuck. ' +
5
- 'Use this to review past accomplishments, find brags to link to goals, or check recent entries.',
5
+ 'Use this to review past accomplishments, find brags to link to keyResults, or check recent entries.',
6
6
  inputSchema: {
7
7
  type: 'object',
8
8
  properties: {
@@ -71,14 +71,14 @@ export async function handleListBrags(input) {
71
71
  const date = new Date(brag.date).toLocaleDateString();
72
72
  const impact = `Impact: ${IMPACT_LABELS[brag.impactLevel ?? 0] ?? (brag.impactLevel ?? 0)}`;
73
73
  const type = brag.type ? ` | Type: ${brag.type}` : '';
74
- const goalNote = brag.goalIds?.length > 0
75
- ? `\n Linked to key result: ${brag.goalIds[0]}`
74
+ const keyResultNote = brag.keyResultIds?.length > 0
75
+ ? `\n Linked to key result: ${brag.keyResultIds[0]}`
76
76
  : '';
77
77
  const impactDesc = brag.impactDescription ? `\n Impact: ${brag.impactDescription}` : '';
78
78
  return (`- **${brag.title}** (ID: ${brag.id}, ${date})${tags}\n` +
79
79
  ` ${impact}${type}` +
80
80
  impactDesc +
81
- goalNote +
81
+ keyResultNote +
82
82
  `\n ${brag.description.slice(0, 150)}${brag.description.length > 150 ? '...' : ''}` +
83
83
  `\n View: ${brag.url}`);
84
84
  });
@@ -1 +1 @@
1
- {"version":3,"file":"list-brags.js","sourceRoot":"","sources":["../../src/tools/list-brags.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list-brags.js","sourceRoot":"","sources":["../../src/tools/list-brags.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { getUserInfo } from '../credentials.js';
3
3
  export const listObjectivesTool = {
4
4
  name: 'list_objectives',
5
5
  description: 'List OKRs (Objectives and Key Results) from BragDuck. ' +
6
- 'Use this to see current goals and their IDs, which can be used to link brags to specific goals.',
6
+ 'Use this to see current keyResults and their IDs, which can be used to link brags to specific keyResults.',
7
7
  inputSchema: {
8
8
  type: 'object',
9
9
  properties: {},
@@ -31,11 +31,11 @@ export async function handleListObjectives() {
31
31
  };
32
32
  }
33
33
  const lines = response.items.map((obj) => {
34
- const goals = obj.goals
35
- .map((g) => ` - ${g.label} (Goal ID: ${g.id}, status: ${g.status})`)
34
+ const keyResults = obj.keyResults
35
+ .map((g) => ` - ${g.label} (KeyResult ID: ${g.id}, status: ${g.status})`)
36
36
  .join('\n');
37
37
  const category = obj.category ? ` [${obj.category}]` : '';
38
- return `- **${obj.title}** (ID: ${obj.id}, status: ${obj.status})${category}\n${goals || ' (no goals)'}`;
38
+ return `- **${obj.title}** (ID: ${obj.id}, status: ${obj.status})${category}\n${keyResults || ' (no keyResults)'}`;
39
39
  });
40
40
  return {
41
41
  content: [{
@@ -1 +1 @@
1
- {"version":3,"file":"list-objectives.js","sourceRoot":"","sources":["../../src/tools/list-objectives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,wDAAwD;QACxD,iGAAiG;IACnG,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;KACf;CACF,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,oBAAoB;IAIxC,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IAC1C,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,aAAa,QAAQ,CAAC,EAAE,aAAa,CACtC,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;aAC1D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK;iBACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC;iBACtE,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,OAAO,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,MAAM,IAAI,QAAQ,KAAK,KAAK,IAAI,gBAAgB,EAAE,CAAC;QAC9G,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,QAAQ,CAAC,KAAK,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;iBACrE,CAAC;SACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,mBAAmB,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC,EAAE,CAAC;YAC3G,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAC7F,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"list-objectives.js","sourceRoot":"","sources":["../../src/tools/list-objectives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,wDAAwD;QACxD,2GAA2G;IAC7G,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;KACf;CACF,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,oBAAoB;IAIxC,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IAC1C,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,aAAa,QAAQ,CAAC,EAAE,aAAa,CACtC,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;aAC1D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU;iBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,mBAAmB,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC;iBAC3E,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,OAAO,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,MAAM,IAAI,QAAQ,KAAK,UAAU,IAAI,qBAAqB,EAAE,CAAC;QACxH,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,QAAQ,CAAC,KAAK,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;iBACrE,CAAC;SACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,mBAAmB,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC,EAAE,CAAC;YAC3G,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAC7F,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ export declare const listStoriesTool: {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: "object";
6
+ properties: {
7
+ limit: {
8
+ type: string;
9
+ minimum: number;
10
+ maximum: number;
11
+ description: string;
12
+ };
13
+ category: {
14
+ type: string;
15
+ description: string;
16
+ };
17
+ orgId: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ search: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ };
26
+ };
27
+ };
28
+ interface ListStoriesInput {
29
+ limit?: number;
30
+ category?: string;
31
+ orgId?: string;
32
+ search?: string;
33
+ }
34
+ export declare function handleListStories(input: ListStoriesInput): Promise<{
35
+ content: Array<{
36
+ type: string;
37
+ text: string;
38
+ }>;
39
+ isError?: boolean;
40
+ }>;
41
+ export {};
@@ -0,0 +1,103 @@
1
+ import { apiRequest, requirePaidPlan } from '../api-client.js';
2
+ import { getUserInfo } from '../credentials.js';
3
+ import { STORY_CATEGORY_LABELS } from '@bragduck/types';
4
+ export const listStoriesTool = {
5
+ name: 'list_stories',
6
+ description: 'List STAR interview stories from BragDuck. ' +
7
+ 'Use when the user wants to review their interview stories or search for stories by category.',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ limit: {
12
+ type: 'number',
13
+ minimum: 1,
14
+ maximum: 100,
15
+ description: 'Max stories to return (default 10)',
16
+ },
17
+ category: {
18
+ type: 'string',
19
+ description: 'Filter by category (e.g. leadership, technical_excellence, problem_solving)',
20
+ },
21
+ orgId: {
22
+ type: 'string',
23
+ description: 'Filter by organisation ID',
24
+ },
25
+ search: {
26
+ type: 'string',
27
+ description: 'Search stories by keyword',
28
+ },
29
+ },
30
+ },
31
+ };
32
+ export async function handleListStories(input) {
33
+ const planError = await requirePaidPlan();
34
+ if (planError)
35
+ return planError;
36
+ try {
37
+ const userInfo = getUserInfo();
38
+ if (!userInfo) {
39
+ return {
40
+ content: [{
41
+ type: 'text',
42
+ text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
43
+ }],
44
+ isError: true,
45
+ };
46
+ }
47
+ const params = {
48
+ page: '1',
49
+ perPage: String(input.limit || 10),
50
+ };
51
+ if (input.category)
52
+ params.category = input.category;
53
+ if (input.orgId)
54
+ params.orgId = input.orgId;
55
+ if (input.search)
56
+ params.search = input.search;
57
+ const response = await apiRequest(`/v1/users/${userInfo.id}/stories`, { params });
58
+ if (response.items.length === 0) {
59
+ return {
60
+ content: [{ type: 'text', text: 'No stories found.' }],
61
+ };
62
+ }
63
+ const lines = response.items.map((story) => {
64
+ const categoryLabel = story.category
65
+ ? STORY_CATEGORY_LABELS[story.category]
66
+ : null;
67
+ const categoryPart = categoryLabel ? `Category: ${categoryLabel} | ` : '';
68
+ const strengthPart = `Strength: ${story.strengthScore ?? '-'}/10`;
69
+ const impactPart = `Impact: ${story.impactScore ?? '-'}/10`;
70
+ const summary = story.aiSummary || 'No AI summary yet';
71
+ const competencies = story.competencies.length > 0
72
+ ? story.competencies.join(', ')
73
+ : 'None';
74
+ return (`**${story.title}** (ID: ${story.id})\n` +
75
+ `${categoryPart}${strengthPart} | ${impactPart}\n` +
76
+ `${summary}\n` +
77
+ `Competencies: ${competencies}`);
78
+ });
79
+ const summary = `Found ${response.total} stories (showing ${response.items.length}):`;
80
+ return {
81
+ content: [{ type: 'text', text: `${summary}\n\n${lines.join('\n\n')}` }],
82
+ };
83
+ }
84
+ catch (error) {
85
+ if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
86
+ return {
87
+ content: [{
88
+ type: 'text',
89
+ text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
90
+ }],
91
+ isError: true,
92
+ };
93
+ }
94
+ return {
95
+ content: [{
96
+ type: 'text',
97
+ text: `Failed to list stories: ${error instanceof Error ? error.message : String(error)}`,
98
+ }],
99
+ isError: true,
100
+ };
101
+ }
102
+ }
103
+ //# sourceMappingURL=list-stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-stories.js","sourceRoot":"","sources":["../../src/tools/list-stories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,6CAA6C;QAC7C,8FAA8F;IAChG,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,GAAG;gBACZ,WAAW,EAAE,oCAAoC;aAClD;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6EAA6E;aAC3F;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2BAA2B;aACzC;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2BAA2B;aACzC;SACF;KACF;CACF,CAAC;AASF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAuB;IAEvB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IAC1C,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAA2B;YACrC,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;SACnC,CAAC;QACF,IAAI,KAAK,CAAC,QAAQ;YAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACrD,IAAI,KAAK,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,aAAa,QAAQ,CAAC,EAAE,UAAU,EAClC,EAAE,MAAM,EAAE,CACX,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;aACvD,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ;gBAClC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,QAAyB,CAAC;gBACxD,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,aAAa,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,MAAM,YAAY,GAAG,aAAa,KAAK,CAAC,aAAa,IAAI,GAAG,KAAK,CAAC;YAClE,MAAM,UAAU,GAAG,WAAW,KAAK,CAAC,WAAW,IAAI,GAAG,KAAK,CAAC;YAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,IAAI,mBAAmB,CAAC;YACvD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;gBAChD,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,CAAC,CAAC,MAAM,CAAC;YAEX,OAAO,CACL,KAAK,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,EAAE,KAAK;gBACxC,GAAG,YAAY,GAAG,YAAY,MAAM,UAAU,IAAI;gBAClD,GAAG,OAAO,IAAI;gBACd,iBAAiB,YAAY,EAAE,CAChC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,SAAS,QAAQ,CAAC,KAAK,qBAAqB,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;QAEtF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;SACzE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,mBAAmB,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC,EAAE,CAAC;YAC3G,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAC1F,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -57,6 +57,11 @@ export declare const logBragTool: {
57
57
  type: string;
58
58
  description: string;
59
59
  };
60
+ agent: {
61
+ type: string;
62
+ maxLength: number;
63
+ description: string;
64
+ };
60
65
  };
61
66
  required: string[];
62
67
  };
@@ -71,6 +76,7 @@ interface LogBragInput {
71
76
  date?: string;
72
77
  references?: string[];
73
78
  orgId?: string;
79
+ agent?: string;
74
80
  }
75
81
  export declare function handleLogBrag(input: LogBragInput): Promise<{
76
82
  content: Array<{
@@ -77,10 +77,27 @@ export const logBragTool = {
77
77
  type: 'string',
78
78
  description: 'Organisation ID to associate the brag with',
79
79
  },
80
+ agent: {
81
+ type: 'string',
82
+ maxLength: 50,
83
+ description: 'Optional AI agent/client name for MCP-origin brags, e.g. "claude", "codex", "cursor", or "copilot".',
84
+ },
80
85
  },
81
86
  required: ['title', 'description', 'type', 'impact_level', 'impact_description', 'references'],
82
87
  },
83
88
  };
89
+ function toAgentExternalType(agent) {
90
+ if (!agent)
91
+ return undefined;
92
+ const normalized = agent
93
+ .trim()
94
+ .toLowerCase()
95
+ .replace(/\s+/g, '-')
96
+ .replace(/[^a-z0-9_-]/g, '');
97
+ if (normalized.length === 0)
98
+ return undefined;
99
+ return `agent:${normalized.slice(0, 50)}`;
100
+ }
84
101
  export async function handleLogBrag(input) {
85
102
  const planError = await requirePaidPlan();
86
103
  if (planError)
@@ -104,6 +121,9 @@ export async function handleLogBrag(input) {
104
121
  brag.attachments = input.references;
105
122
  if (input.orgId)
106
123
  brag.orgId = input.orgId;
124
+ const agentExternalType = toAgentExternalType(input.agent);
125
+ if (agentExternalType)
126
+ brag.externalType = agentExternalType;
107
127
  const response = await apiRequest('/v1/brags', {
108
128
  method: 'POST',
109
129
  body: { brags: [brag], source: 'mcp' },
@@ -111,8 +131,8 @@ export async function handleLogBrag(input) {
111
131
  if (response.brags && response.brags.length > 0) {
112
132
  const created = response.brags[0];
113
133
  const lines = [`Brag logged: "${created.title}"\nView it at: ${created.url}`];
114
- if (created.goalIds && created.goalIds.length > 0) {
115
- lines.push(`Automatically linked to key result: ${created.goalIds[0]}`);
134
+ if (created.keyResultIds && created.keyResultIds.length > 0) {
135
+ lines.push(`Automatically linked to key result: ${created.keyResultIds[0]}`);
116
136
  }
117
137
  return {
118
138
  content: [{
@@ -1 +1 @@
1
- {"version":3,"file":"log-brag.js","sourceRoot":"","sources":["../../src/tools/log-brag.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"log-brag.js","sourceRoot":"","sources":["../../src/tools/log-brag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG/D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,mDAAmD;QACnD,gGAAgG;QAChG,qFAAqF;IACvF,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,4DAA4D;aAC1E;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,2FAA2F;aACzG;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;gBACtD,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,gIAAgI;aAC9I;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,8DAA8D;aAC5E;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClB,WAAW,EACT,mCAAmC;oBACnC,+CAA+C;oBAC/C,4DAA4D;oBAC5D,sEAAsE;oBACtE,4EAA4E;aAC/E;YACD,kBAAkB,EAAE;gBAClB,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,uCAAuC;oBACvC,gEAAgE;oBAChE,wCAAwC;oBACxC,4EAA4E;aAC/E;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,UAAU;oBACV,aAAa;oBACb,aAAa;oBACb,SAAS;oBACT,MAAM;oBACN,YAAY;oBACZ,UAAU;oBACV,eAAe;oBACf,WAAW;oBACX,YAAY;oBACZ,SAAS;oBACT,KAAK;oBACL,QAAQ;iBACT;gBACD,WAAW,EAAE,0EAA0E;aACxF;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;gBACxC,QAAQ,EAAE,EAAE;gBACZ,WAAW,EACT,oDAAoD;oBACpD,4DAA4D;oBAC5D,uFAAuF;oBACvF,+FAA+F;aAClG;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4CAA4C;aAC1D;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,EAAE;gBACb,WAAW,EACT,qGAAqG;aACxG;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,CAAC;KAC/F;CACF,CAAC;AAeF,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,UAAU,GAAG,KAAK;SACrB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAE/B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9C,OAAO,SAAS,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAmB;IAEnB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IAC1C,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,WAAW;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5C,UAAU,EAAE,SAAS;SACtB,CAAC;QAEF,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC;QAC5E,IAAI,KAAK,CAAC,kBAAkB;YAAE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC;QACjF,IAAI,KAAK,CAAC,IAAI;YAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;QAC1C,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC;QACzF,IAAI,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1C,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,iBAAiB;YAAE,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAyB,WAAW,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;SACvC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,CAAC,iBAAiB,OAAO,CAAC,KAAK,kBAAkB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9E,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,uCAAuC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;qBACvB,CAAC;aACH,CAAC;QACJ,CAAC;QAED,oEAAoE;QACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAC9D,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO;YAC5B,CAAC,CAAC,6CAA6C,CAAC;QAClD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,0BAA0B,UAAU,EAAE;iBAC7C,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,mBAAmB,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC,EAAE,CAAC;YAC3G,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACzF,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,81 @@
1
+ export declare const logStoryTool: {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: "object";
6
+ properties: {
7
+ title: {
8
+ type: string;
9
+ minLength: number;
10
+ maxLength: number;
11
+ description: string;
12
+ };
13
+ situation: {
14
+ type: string;
15
+ minLength: number;
16
+ description: string;
17
+ };
18
+ task: {
19
+ type: string;
20
+ minLength: number;
21
+ description: string;
22
+ };
23
+ action: {
24
+ type: string;
25
+ minLength: number;
26
+ description: string;
27
+ };
28
+ result: {
29
+ type: string;
30
+ minLength: number;
31
+ description: string;
32
+ };
33
+ competencies: {
34
+ type: string;
35
+ items: {
36
+ type: string;
37
+ minLength: number;
38
+ maxLength: number;
39
+ };
40
+ maxItems: number;
41
+ description: string;
42
+ };
43
+ bragIds: {
44
+ type: string;
45
+ items: {
46
+ type: string;
47
+ };
48
+ maxItems: number;
49
+ description: string;
50
+ };
51
+ orgId: {
52
+ type: string;
53
+ description: string;
54
+ };
55
+ category: {
56
+ type: string;
57
+ description: string;
58
+ };
59
+ };
60
+ required: string[];
61
+ };
62
+ };
63
+ interface LogStoryInput {
64
+ title: string;
65
+ situation: string;
66
+ task: string;
67
+ action: string;
68
+ result: string;
69
+ competencies?: string[];
70
+ bragIds?: string[];
71
+ orgId?: string;
72
+ category?: string;
73
+ }
74
+ export declare function handleLogStory(input: LogStoryInput): Promise<{
75
+ content: Array<{
76
+ type: string;
77
+ text: string;
78
+ }>;
79
+ isError?: boolean;
80
+ }>;
81
+ export {};
@@ -0,0 +1,122 @@
1
+ import { apiRequest, requirePaidPlan } from '../api-client.js';
2
+ import { getUserInfo } from '../credentials.js';
3
+ export const logStoryTool = {
4
+ name: 'log_story',
5
+ description: 'Save a STAR-formatted interview story to BragDuck. ' +
6
+ 'Use this when the user discusses interview prep, behavioral questions, or asks to save a story. ' +
7
+ 'Each story has Situation, Task, Action, Result fields plus competency tags. ' +
8
+ 'Call this in the same response as a preview — the tool permission prompt (Allow/Deny) ' +
9
+ 'that appears to the user IS the confirmation.',
10
+ inputSchema: {
11
+ type: 'object',
12
+ properties: {
13
+ title: {
14
+ type: 'string',
15
+ minLength: 5,
16
+ maxLength: 200,
17
+ description: 'Short title for the story (e.g., "Led migration to microservices")',
18
+ },
19
+ situation: {
20
+ type: 'string',
21
+ minLength: 10,
22
+ description: 'The context and background — what was happening, what was the environment',
23
+ },
24
+ task: {
25
+ type: 'string',
26
+ minLength: 10,
27
+ description: 'What was your specific responsibility or challenge',
28
+ },
29
+ action: {
30
+ type: 'string',
31
+ minLength: 10,
32
+ description: 'What you specifically did — the steps you took',
33
+ },
34
+ result: {
35
+ type: 'string',
36
+ minLength: 10,
37
+ description: 'The outcome — measurable impact, what changed, what you learned',
38
+ },
39
+ competencies: {
40
+ type: 'array',
41
+ items: { type: 'string', minLength: 2, maxLength: 50 },
42
+ maxItems: 20,
43
+ description: 'Skills or competencies this story demonstrates (e.g., "leadership", "system design", "conflict resolution")',
44
+ },
45
+ bragIds: {
46
+ type: 'array',
47
+ items: { type: 'string' },
48
+ maxItems: 20,
49
+ description: 'IDs of BragDuck brags that back this story',
50
+ },
51
+ orgId: {
52
+ type: 'string',
53
+ description: 'Organisation ID to associate the story with',
54
+ },
55
+ category: {
56
+ type: 'string',
57
+ description: 'Interview category this story demonstrates (e.g. leadership, technical_excellence, problem_solving, innovation, teamwork, communication, project_delivery, customer_impact, mentorship, process_improvement)',
58
+ },
59
+ },
60
+ required: ['title', 'situation', 'task', 'action', 'result'],
61
+ },
62
+ };
63
+ export async function handleLogStory(input) {
64
+ const planError = await requirePaidPlan();
65
+ if (planError)
66
+ return planError;
67
+ try {
68
+ const userInfo = getUserInfo();
69
+ if (!userInfo) {
70
+ return {
71
+ content: [{
72
+ type: 'text',
73
+ text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
74
+ }],
75
+ isError: true,
76
+ };
77
+ }
78
+ const body = {
79
+ title: input.title,
80
+ situation: input.situation,
81
+ task: input.task,
82
+ action: input.action,
83
+ result: input.result,
84
+ competencies: input.competencies || [],
85
+ bragIds: input.bragIds || [],
86
+ source: 'mcp',
87
+ };
88
+ if (input.orgId)
89
+ body.orgId = input.orgId;
90
+ if (input.category)
91
+ body.category = input.category;
92
+ const story = await apiRequest(`/v1/users/${userInfo.id}/stories`, { method: 'POST', body });
93
+ const competencyLine = story.competencies.length > 0
94
+ ? `\nCompetencies: ${story.competencies.join(', ')}`
95
+ : '';
96
+ return {
97
+ content: [{
98
+ type: 'text',
99
+ text: `Story saved: "${story.title}"${competencyLine}`,
100
+ }],
101
+ };
102
+ }
103
+ catch (error) {
104
+ if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
105
+ return {
106
+ content: [{
107
+ type: 'text',
108
+ text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
109
+ }],
110
+ isError: true,
111
+ };
112
+ }
113
+ return {
114
+ content: [{
115
+ type: 'text',
116
+ text: `Failed to save story: ${error instanceof Error ? error.message : String(error)}`,
117
+ }],
118
+ isError: true,
119
+ };
120
+ }
121
+ }
122
+ //# sourceMappingURL=log-story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-story.js","sourceRoot":"","sources":["../../src/tools/log-story.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export declare const quickBragTool: {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: "object";
6
+ properties: {
7
+ text: {
8
+ type: string;
9
+ minLength: number;
10
+ maxLength: number;
11
+ description: string;
12
+ };
13
+ orgId: {
14
+ type: string;
15
+ description: string;
16
+ };
17
+ agent: {
18
+ type: string;
19
+ maxLength: number;
20
+ description: string;
21
+ };
22
+ };
23
+ required: string[];
24
+ };
25
+ };
26
+ interface QuickBragInput {
27
+ text: string;
28
+ orgId?: string;
29
+ agent?: string;
30
+ }
31
+ export declare function handleQuickBrag(input: QuickBragInput): Promise<{
32
+ content: Array<{
33
+ type: string;
34
+ text: string;
35
+ }>;
36
+ isError?: boolean;
37
+ }>;
38
+ export {};
@@ -0,0 +1,143 @@
1
+ import { apiRequest, requirePaidPlan } from '../api-client.js';
2
+ export const quickBragTool = {
3
+ name: 'quick_brag',
4
+ description: 'Log a brag from raw text. Accepts free-form text (a sentence, paragraph, or paste from a message/PR/doc) ' +
5
+ 'and uses AI to extract and structure it into a proper brag. The AI will parse the text into a title, ' +
6
+ 'description, type, impact, and tags, then log it. Use this when the user says "/brag" followed by text, ' +
7
+ 'or pastes something and asks to log it as a brag.',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ text: {
12
+ type: 'string',
13
+ minLength: 10,
14
+ maxLength: 5000,
15
+ description: 'Raw text describing the achievement. Can be a sentence, paragraph, paste from a PR description, ' +
16
+ 'Slack message, commit message, or any free-form text. The AI will extract brag fields from it.',
17
+ },
18
+ orgId: {
19
+ type: 'string',
20
+ description: 'Organisation ID to associate the brag with (optional)',
21
+ },
22
+ agent: {
23
+ type: 'string',
24
+ maxLength: 50,
25
+ description: 'Optional AI agent/client name, e.g. "claude", "cursor", "copilot".',
26
+ },
27
+ },
28
+ required: ['text'],
29
+ },
30
+ };
31
+ function toAgentExternalType(agent) {
32
+ if (!agent)
33
+ return undefined;
34
+ const normalized = agent
35
+ .trim()
36
+ .toLowerCase()
37
+ .replace(/\s+/g, '-')
38
+ .replace(/[^a-z0-9_-]/g, '');
39
+ if (normalized.length === 0)
40
+ return undefined;
41
+ return `agent:${normalized.slice(0, 50)}`;
42
+ }
43
+ export async function handleQuickBrag(input) {
44
+ const planError = await requirePaidPlan();
45
+ if (planError)
46
+ return planError;
47
+ try {
48
+ // Step 1: Refine raw text into structured brag via AI
49
+ const refined = await apiRequest('/v1/brags/refine', {
50
+ method: 'POST',
51
+ body: { brags: [{ text: input.text }] },
52
+ });
53
+ if (!refined.refined_brags || refined.refined_brags.length === 0) {
54
+ return {
55
+ content: [{
56
+ type: 'text',
57
+ text: 'Could not extract a brag from the provided text. Try adding more detail about what was accomplished and its impact.',
58
+ }],
59
+ isError: true,
60
+ };
61
+ }
62
+ // Step 2: Log the refined brag
63
+ const extracted = refined.refined_brags[0];
64
+ const brag = {
65
+ title: extracted.refined_title,
66
+ description: extracted.refined_description,
67
+ tags: extracted.suggested_tags || [],
68
+ date: new Date().toISOString(),
69
+ visibility: 'private',
70
+ impactLevel: extracted.suggested_impactLevel,
71
+ impact_description: extracted.impact_description || '',
72
+ typeKey: extracted.suggested_type_key,
73
+ };
74
+ const allLinks = [
75
+ ...(extracted.extracted_links || []),
76
+ ...(extracted.attachments || []),
77
+ ].filter(Boolean);
78
+ if (allLinks.length > 0)
79
+ brag.attachments = allLinks;
80
+ if (input.orgId)
81
+ brag.orgId = input.orgId;
82
+ const agentExternalType = toAgentExternalType(input.agent);
83
+ if (agentExternalType)
84
+ brag.externalType = agentExternalType;
85
+ const response = await apiRequest('/v1/brags', {
86
+ method: 'POST',
87
+ body: { brags: [brag], source: 'mcp' },
88
+ });
89
+ // Check for validation errors first
90
+ if (response.errors && response.errors.length > 0) {
91
+ const errorMessages = response.errors.map((e) => e.message).join('; ');
92
+ return {
93
+ content: [{
94
+ type: 'text',
95
+ text: `Failed to create brag: ${errorMessages}`,
96
+ }],
97
+ isError: true,
98
+ };
99
+ }
100
+ if (response.brags && response.brags.length > 0) {
101
+ const created = response.brags[0];
102
+ const lines = [
103
+ `Brag logged: "${created.title}"`,
104
+ `${created.url}`,
105
+ ];
106
+ if (created.keyResultIds && created.keyResultIds.length > 0) {
107
+ lines.push(`Automatically linked to key result: ${created.keyResultIds[0]}`);
108
+ }
109
+ return {
110
+ content: [{
111
+ type: 'text',
112
+ text: lines.join('\n'),
113
+ }],
114
+ };
115
+ }
116
+ return {
117
+ content: [{
118
+ type: 'text',
119
+ text: 'Server returned no brag and no error detail',
120
+ }],
121
+ isError: true,
122
+ };
123
+ }
124
+ catch (error) {
125
+ if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
126
+ return {
127
+ content: [{
128
+ type: 'text',
129
+ text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
130
+ }],
131
+ isError: true,
132
+ };
133
+ }
134
+ return {
135
+ content: [{
136
+ type: 'text',
137
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
138
+ }],
139
+ isError: true,
140
+ };
141
+ }
142
+ }
143
+ //# sourceMappingURL=quick-brag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-brag.js","sourceRoot":"","sources":["../../src/tools/quick-brag.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bragduck/mcp",
3
- "version": "1.5.4",
3
+ "version": "1.7.0",
4
4
  "description": "BragDuck MCP server for logging career achievements from AI agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-brag-to-goal.js","sourceRoot":"","sources":["../../src/tools/link-brag-to-goal.ts"],"names":[],"mappings":"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"}