wolfpack-mcp 1.0.99 → 1.0.100

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
@@ -10,7 +10,8 @@ import { WolfpackClient } from './client.js';
10
10
  import { allTasksChecked, getWorkItemReminders } from './workItemReminders.js';
11
11
  import { validateConfig, config } from './config.js';
12
12
  import { AGENT_BUILDER_TOOLS, handleAgentBuilderTool } from './agentBuilderTools.js';
13
- import { PROCEDURE_TOOLS, handleProcedureTool } from './procedureTools.js';
13
+ import { handleProcedureTool } from './procedureTools.js';
14
+ import { stdioTools, toolNamesFor } from './toolCatalogue.js';
14
15
  import { AGENT_SELF_TOOLS, AGENT_MEMORY_TOOLS, handleAgentSelfTool } from './agentSelfTools.js';
15
16
  import { BROWSER_TOOLS, handleBrowserTool } from './browserTools.js';
16
17
  import { resolveRadarItemId } from './resolveRadarItemId.js';
@@ -54,13 +55,6 @@ async function checkForUpdates() {
54
55
  }
55
56
  return null;
56
57
  }
57
- // Cross-reference syntax for linking between content items in markdown fields
58
- const CONTENT_LINKING_HELP = 'CROSS-REFERENCES: In any markdown content, you can link to other items using these patterns: ' +
59
- '#123, #w123, or #work-123 for work items (DEFAULT — bare #N always means a work item), ' +
60
- '#i123 or #issue-123 for issues, #r123 or #roadmap-123 for initiatives/roadmap, ' +
61
- '#j123 or #journal-123 for journal entries, #c123 or #case-123 for cases, #p123 or #proc-123 for procedures. ' +
62
- 'Use @username to mention team members (triggers notifications). ' +
63
- 'Standard markdown links also work: [link text](/project/{slug}/work-items/123).';
64
58
  /** Zod string that strips a leading '#' so agents can pass "#42" or "42". */
65
59
  const refIdString = () => z.string().transform((v) => v.replace(/^#/, ''));
66
60
  // Work Item schemas
@@ -500,14 +494,6 @@ const UpdateWikiPageSchema = z.object({
500
494
  page_id: z.string().describe('The page slug'),
501
495
  title: z.string().optional().describe('Updated title'),
502
496
  content: z.string().optional().describe('Updated content (markdown)'),
503
- tag_ids: z
504
- .array(z.string())
505
- .optional()
506
- .describe('Tag IDs to apply to the page (replaces existing tags)'),
507
- project_slug: z
508
- .string()
509
- .optional()
510
- .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
511
497
  });
512
498
  // Journal Entry schemas
513
499
  const ListJournalEntriesSchema = z.object({
@@ -540,7 +526,6 @@ const UpdateJournalEntrySchema = z.object({
540
526
  entry_id: z.string().describe('The entry refId (number)'),
541
527
  title: z.string().optional().describe('Updated title'),
542
528
  content: z.string().optional().describe('Updated content (markdown)'),
543
- tag_ids: z.array(z.string()).optional().describe('Tag IDs to apply (replaces existing tags)'),
544
529
  project_slug: z
545
530
  .string()
546
531
  .optional()
@@ -844,1724 +829,7 @@ class WolfpackMCPServer {
844
829
  }
845
830
  return {
846
831
  tools: [
847
- // Project tools
848
- {
849
- name: 'list_projects',
850
- description: 'List all projects you have access to. Projects can be "personal" (single user) or "team" (multi-member). ' +
851
- 'IMPORTANT - PROJECT FOCUS RULES: ' +
852
- '1) Call this FIRST to identify which project you are working in. ' +
853
- '2) Once you identify a project, STAY WITHIN that project for all operations unless the user explicitly asks to switch. ' +
854
- '3) NEVER perform bulk actions across multiple projects - always work in one project at a time. ' +
855
- '4) If the user mentions a specific project, use that for all subsequent operations. ' +
856
- '5) If unclear which project to use, ASK the user before proceeding. ' +
857
- 'Returns project slugs, names, and types. Single-project users have their project auto-selected; multi-project users must specify project_slug in other tool calls. ' +
858
- 'ID CONVENTION: A bare number like #1 or #42 ALWAYS refers to a WORK ITEM refId — use get_work_item. ' +
859
- 'Other document types REQUIRE a prefix and are never bare numbers: ' +
860
- '#i1 or #issue-1 for issues, #r1 or #roadmap-1 for roadmap/radar, ' +
861
- '#j1 or #journal-1 for journal, #c1 or #case-1 for cases, #p1 or #proc-1 for procedures. ' +
862
- 'Wiki pages are referenced by path (e.g. /docs/setup). There is no ambiguity: bare #N = work item, and never a GitHub issue or pull request — read a number as a GitHub reference only when the user says GitHub, PR, or gh.',
863
- inputSchema: {
864
- type: 'object',
865
- properties: {},
866
- },
867
- },
868
- // Search tool
869
- {
870
- name: 'search',
871
- description: 'Ranked full-text search across project content: wiki pages, work items, cases, journal entries, issues and the Wolfpack user manual. ' +
872
- 'Title matches outrank body matches; results include a snippet, entity type, and refId/slug for follow-up calls ' +
873
- '(get_work_item, get_issue, get_wiki_page, ...). Results with entityType "manual" are user manual sections — platform documentation on how Wolfpack features work. ' +
874
- 'Use this to find existing content before creating new items, or when the user asks to "find" or "look up" something without saying where it lives.',
875
- inputSchema: {
876
- type: 'object',
877
- properties: {
878
- query: {
879
- type: 'string',
880
- description: 'Search query (websearch syntax: quoted phrases, -exclusions)',
881
- },
882
- project_slug: {
883
- type: 'string',
884
- description: 'Project slug; omit to search all accessible projects',
885
- },
886
- include_inactive: {
887
- type: 'boolean',
888
- description: 'Include finished/archived items (default false)',
889
- },
890
- exact_only: {
891
- type: 'boolean',
892
- description: 'Only exact full-text matches, skipping semantic results (default false)',
893
- },
894
- },
895
- required: ['query'],
896
- },
897
- },
898
- // Work Item tools
899
- {
900
- name: 'list_work_items',
901
- description: 'List work items (tasks/tickets) on the Kanban board or backlog. Work items are the PRIMARY entity — bare #N references (e.g. "work on #1") always mean work items. ' +
902
- 'By default lists ALL items in the team, sorted by most recently updated. ' +
903
- 'Use assigned_to_id="me" to filter to only your assigned items. ' +
904
- 'AGENTS: unless granted the mcp:work_items:read_all permission, your results are always ' +
905
- 'narrowed to items assigned to you or routed to a work pool you belong to, whatever ' +
906
- 'assigned_to_id you pass; the response says so when this applies. ' +
907
- 'AGENTS: when more than one item is claimable, the response also states the order to take ' +
908
- 'them in (bug fixes first, then higher priority, then oldest) and which to pull next. ' +
909
- 'AGENTS: blockedBy on each item names the prerequisites of it that have not finished. An item ' +
910
- 'with a non-empty blockedBy is NOT claimable however approved it is — take the work it names ' +
911
- 'first; the response says so too. ' +
912
- 'TERMINOLOGY: "board" and "kanban" are synonymous - both refer to the Kanban board of work items. ' +
913
- 'The board has columns: "new" (to do), "doing" (in progress), "review" (pending review), "ready" (code done, awaiting deployment), "blocked", "completed" (deployed). ' +
914
- 'The "backlog" or "pending" status represents items not yet on the board. ' +
915
- 'By default, completed/closed items are excluded - use status="all" to include them. ' +
916
- 'IMPORTANT: Work items are NOT the same as issues. Work items live on the Kanban board/backlog. ' +
917
- 'If a user mentions "bugs" in the context of the board/kanban/backlog, they mean work items categorised as bug fixes - use this tool, not list_issues. ' +
918
- 'Use when user asks about "the board", "kanban", "work items", "tasks", "my work" (with assigned_to_id="me"), or "backlog".',
919
- inputSchema: {
920
- type: 'object',
921
- properties: {
922
- project_slug: {
923
- type: 'string',
924
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
925
- },
926
- status: {
927
- type: 'string',
928
- description: 'Filter by status. Board columns: "new", "doing", "review", "ready", "blocked", "completed". ' +
929
- 'Use "pending" or "backlog" for backlog items not on board. ' +
930
- 'Use "all" to include completed/closed items. Default excludes completed/closed.',
931
- },
932
- assigned_to_id: {
933
- type: 'string',
934
- description: 'Filter by assignee: "all" (default, shows all team items), "me" (your assigned items), "unassigned", or a specific user ID',
935
- },
936
- search: {
937
- type: 'string',
938
- description: 'Text search in title and description',
939
- },
940
- category_id: {
941
- type: 'string',
942
- description: 'Filter by category ID, or "none" for uncategorized items',
943
- },
944
- priority: {
945
- type: 'string',
946
- description: 'Filter by priority level (0-4, higher is more important)',
947
- },
948
- radar_item_id: {
949
- type: 'string',
950
- description: 'Filter by linked radar/initiative item. Accepts refId (e.g. "5" or "#r5"), UUID, ' +
951
- 'or one of "none" (no link), "any" (has any link), "all" (no filter).',
952
- },
953
- sort_by: {
954
- type: 'string',
955
- description: 'Sort field: "dateUpdated" (default, newest activity first), "dateCreated", "priority", "title"',
956
- },
957
- sort_order: {
958
- type: 'string',
959
- description: 'Sort direction: "desc" (default), "asc"',
960
- },
961
- date_from: {
962
- type: 'string',
963
- description: 'Filter items created on or after this date (ISO format, e.g. "2025-01-01")',
964
- },
965
- date_to: {
966
- type: 'string',
967
- description: 'Filter items created on or before this date (ISO format, e.g. "2025-12-31")',
968
- },
969
- approved: {
970
- type: 'string',
971
- description: 'Filter by approval: "true" for approved items, "false" for not-yet-approved. ' +
972
- 'Unassigned backlog ("pending") items must be approved by a human before agents may ' +
973
- 'pull them; items assigned to you can be pulled regardless.',
974
- },
975
- limit: { type: 'number', description: 'Maximum number of items to return' },
976
- offset: { type: 'number', description: 'Number of items to skip' },
977
- },
978
- },
979
- },
980
- {
981
- name: 'get_work_item',
982
- description: 'Get a specific work item/task by reference number. This is the DEFAULT lookup when a user says "#1" or "work on #42" — bare #N always means a work item, never a GitHub issue: use this tool, not `gh issue view`. ' +
983
- 'Returns full details including description (markdown notes). ' +
984
- 'Call this before updating to see current content. ' +
985
- 'WORKFLOW: When asked to work on an item, check its status and follow the required state transitions ' +
986
- '(pending→pull first, new→doing, review→doing when you are picking the work back up, ' +
987
- 'ready/completed/closed→new→doing, then review when done). ' +
988
- 'AGENTS: a "blocked" item is not yours to restart — a human clears the blocker. Leave it where it is, ' +
989
- 'comment if you can help clear it, and take the next claimable item instead. ' +
990
- 'PLANNING: Check if the description contains a plan (markdown checklist). If not, APPEND one using update_work_progress - preserve all original description text and add your plan below a "---" separator. ' +
991
- 'FORMS: Procedure-created work items may include formDefinition (field definitions with name, label, type, required, options) and formValues (current values). Use submit_work_item_form to fill in form values. ' +
992
- 'REVIEW CHECKS: items under review may carry review checks (code-review, security-review, ...); see list_work_item_checks and claim/complete_work_item_check. ' +
993
- 'DEPENDENCIES: dependsOn lists the work this item follows and nextItems the work that follows it, each with satisfied=true once it has finished. ' +
994
- 'An item with an unsatisfied entry in dependsOn cannot be pulled yet — take the work it depends on first. ' +
995
- 'IMAGES: Image references in the description (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
996
- inputSchema: {
997
- type: 'object',
998
- properties: {
999
- work_item_id: {
1000
- type: 'string',
1001
- description: 'The refId (number) of the work item',
1002
- },
1003
- project_slug: {
1004
- type: 'string',
1005
- description: 'Project slug (required for refId lookup)',
1006
- },
1007
- },
1008
- required: ['work_item_id'],
1009
- },
1010
- },
1011
- {
1012
- name: 'update_work_progress',
1013
- description: 'Update work item description/notes with your progress. WORKFLOW: 1) get_work_item to read current notes 2) Modify the markdown description with new findings/progress 3) Call this with the complete updated description. The full description replaces the existing one. ' +
1014
- 'STATUS: Items in "new" — and items in "review" you are picking back up — are auto-advanced to "doing" (recording progress means work is under way). Completing the work is NOT auto-detected: when done, set status to "review" via update_work_item and add a completion comment. ' +
1015
- 'CRITICAL: NEVER overwrite or remove the original description text. Preserve all existing content exactly as-is. Append your plan below a "---" separator. You may only modify content you previously added (your plan section). ' +
1016
- 'BEST PRACTICE: Append a plan with markdown checkboxes (- [ ] task). Check off completed tasks (- [x] task) as you progress. Include sections for: Plan (checklist), Approach (strategy), and Notes (discoveries/decisions). ' +
1017
- CONTENT_LINKING_HELP,
1018
- inputSchema: {
1019
- type: 'object',
1020
- properties: {
1021
- work_item_id: { type: 'string', description: 'The ID of the work item' },
1022
- description: {
1023
- type: 'string',
1024
- description: 'Updated description/notes for the work item',
1025
- },
1026
- project_slug: {
1027
- type: 'string',
1028
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1029
- },
1030
- },
1031
- required: ['work_item_id', 'description'],
1032
- },
1033
- },
1034
- {
1035
- name: 'update_work_item',
1036
- description: 'Update one or more fields on a work item. Only provide the fields you want to change. ' +
1037
- 'Supports: title, description, status, leading_user_id (assignee), assisting_user1/2/3_id, ' +
1038
- 'radar_item_id (initiative), category_id, priority (0-4), size (S/M/L), work_pool_id, tags, and closing_comment. ' +
1039
- 'STATUS WORKFLOW: "pending" (backlog) → "new" (to do) → "doing" (in progress) → "review" (work done) → "ready" (awaiting deployment) → "completed" (deployed). ' +
1040
- 'Use "blocked" when work cannot proceed. AGENTS: you cannot start un-started work here — ' +
1041
- 'a status change on a "pending" or "new" item that is not assigned to you is refused. ' +
1042
- 'Nor can you move an item OUT of "blocked": clearing a blocker is a human decision. ' +
1043
- 'Take it with pull_work_item, which assigns it to you and puts it in "doing"; that is ' +
1044
- 'what makes the board show who is working on what. ' +
1045
- 'When moving to "review", add a completion comment via create_work_item_comment. When moving to "blocked", add a comment explaining the blocker. ' +
1046
- 'When you take an item back out of "review" to rework it, set it to "doing" first — an item being changed is not an item waiting to be reviewed. ' +
1047
- 'closing_comment is only accepted together with status "closed" — never use it for progress or completion notes.',
1048
- inputSchema: {
1049
- type: 'object',
1050
- properties: {
1051
- work_item_id: {
1052
- type: 'string',
1053
- description: 'The ID of the work item',
1054
- },
1055
- title: {
1056
- type: 'string',
1057
- description: 'New title for the work item',
1058
- },
1059
- description: {
1060
- type: 'string',
1061
- description: 'Updated description (supports Markdown and @mentions)',
1062
- },
1063
- status: {
1064
- type: 'string',
1065
- enum: [
1066
- 'pending',
1067
- 'new',
1068
- 'doing',
1069
- 'blocked',
1070
- 'review',
1071
- 'ready',
1072
- 'completed',
1073
- 'closed',
1074
- 'archived',
1075
- ],
1076
- description: 'New status',
1077
- },
1078
- leading_user_id: {
1079
- type: ['string', 'null'],
1080
- description: "User ID to assign as leading user, or null to unassign. Agents may not assign work to themselves — that is the Delivery Lead's decision.",
1081
- },
1082
- radar_item_id: {
1083
- type: ['string', 'null'],
1084
- description: 'Link to a radar/initiative item. Accepts refId (e.g. "5" or "#r5") or UUID. Use null to unlink.',
1085
- },
1086
- category_id: {
1087
- type: ['string', 'null'],
1088
- description: 'Category ID to set, or null to remove the category',
1089
- },
1090
- priority: {
1091
- type: 'number',
1092
- description: 'Priority level: 0 (None), 1 (Low), 2 (Medium), 3 (High), 4 (Urgent)',
1093
- },
1094
- size: {
1095
- type: ['string', 'null'],
1096
- enum: ['S', 'M', 'L', null],
1097
- description: 'Size estimate: "S" (small), "M" (medium), "L" (large), or null to remove',
1098
- },
1099
- assisting_user1_id: {
1100
- type: ['string', 'null'],
1101
- description: 'User ID for first assisting user, or null to remove',
1102
- },
1103
- assisting_user2_id: {
1104
- type: ['string', 'null'],
1105
- description: 'User ID for second assisting user, or null to remove',
1106
- },
1107
- assisting_user3_id: {
1108
- type: ['string', 'null'],
1109
- description: 'User ID for third assisting user, or null to remove',
1110
- },
1111
- work_pool_id: {
1112
- type: ['string', 'null'],
1113
- description: 'Work pool to route the item to (pool ID or name), or null to remove it from its pool',
1114
- },
1115
- tags: {
1116
- type: 'array',
1117
- items: { type: 'string' },
1118
- description: 'Tag names to apply (replaces existing tags). Use list_tags to see available tags.',
1119
- },
1120
- closing_comment: {
1121
- type: ['string', 'null'],
1122
- description: 'ONLY when closing: comment explaining why the item is closed, provided together with status "closed". ' +
1123
- 'Not for progress or completion notes — use create_work_item_comment for those.',
1124
- },
1125
- project_slug: {
1126
- type: 'string',
1127
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1128
- },
1129
- },
1130
- required: ['work_item_id'],
1131
- },
1132
- },
1133
- {
1134
- name: 'pull_work_item',
1135
- description: 'Pull a specific work item from the backlog to the board, or claim one already on it. ' +
1136
- 'REQUIRED: Use this when starting work on a "pending" (backlog) item, and to claim an ' +
1137
- 'unassigned "new" (board) item — approved board work is picked up just like approved ' +
1138
- 'backlog work. This claims the item (assigns to you); a backlog item also moves to "new". ' +
1139
- 'AGENTS: an item already assigned to you is always pullable, approved or not. An item ' +
1140
- 'that is NOT assigned to you is pullable only if it is routed to a work pool you belong ' +
1141
- 'to AND a human has approved it (approved=true) — pool membership grants the access, ' +
1142
- 'approval grants the go-ahead. An unassigned item in no work pool cannot be pulled by an ' +
1143
- 'agent and will return 403: ask a human to route it to your pool or assign it to you. ' +
1144
- 'AGENTS: pulling puts the item straight into "doing" — you are taking it to start on it ' +
1145
- 'now — so there is no separate "move it to doing" step. Move it to "review" when done. ' +
1146
- 'AGENTS: with more than one item claimable, take them in the order list_work_items gives ' +
1147
- 'you: bug fixes first, then higher priority, then oldest. ' +
1148
- 'AGENTS: an item waiting on unfinished work it depends on is not claimable and will return ' +
1149
- '403 naming what to take first — see dependsOn on get_work_item. ' +
1150
- 'AGENTS: one item at a time — while you lead an item in "doing" (for example one a ' +
1151
- 'reviewer sent back), pulling another returns 403 naming it; resume that item and move it ' +
1152
- 'to "review" (or "blocked") first. ' +
1153
- 'If no assignee is specified, assigns to the API key owner. ' +
1154
- 'In personal projects, items are always assigned to the owner.',
1155
- inputSchema: {
1156
- type: 'object',
1157
- properties: {
1158
- work_item_id: {
1159
- type: 'string',
1160
- description: 'The ID of the work item to pull or claim',
1161
- },
1162
- leading_user_id: {
1163
- type: 'string',
1164
- description: 'User ID to assign as leading user (optional, defaults to API key owner)',
1165
- },
1166
- project_slug: {
1167
- type: 'string',
1168
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1169
- },
1170
- },
1171
- required: ['work_item_id'],
1172
- },
1173
- },
1174
- {
1175
- name: 'submit_work_item_form',
1176
- description: 'Submit form values for a procedure-created work item. ' +
1177
- 'Use get_work_item first to see formDefinition (field names, types, required) and current formValues. ' +
1178
- 'Then call this with form_values mapping field names to values.',
1179
- inputSchema: {
1180
- type: 'object',
1181
- properties: {
1182
- work_item_id: {
1183
- type: 'string',
1184
- description: 'The ID of the work item',
1185
- },
1186
- form_values: {
1187
- type: 'object',
1188
- description: 'Key-value pairs matching formDefinition field names',
1189
- },
1190
- project_slug: {
1191
- type: 'string',
1192
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1193
- },
1194
- },
1195
- required: ['work_item_id', 'form_values'],
1196
- },
1197
- },
1198
- {
1199
- name: 'list_work_item_checks',
1200
- description: 'List review checks (key controls such as code-review, security-review, e2e-review) on work items. ' +
1201
- 'With work_item_id: every check on that item. Without it: your REVIEWER INBOX — pending checks on ' +
1202
- 'work items in the work pools you belong to that are unclaimed or held by you, each with workItemRefId and workItemTitle. ' +
1203
- 'Checks on blocked items are left out — blocked work is not picked up, and claiming one is refused. ' +
1204
- 'REVIEW WORKFLOW: claim a check with claim_work_item_check, get_work_item to read the work, review it, ' +
1205
- 'then complete_work_item_check with "passed" or "failed" and a short summary. ' +
1206
- 'A failed check sends the item back to its developer with your summary as feedback; do not change the item status yourself. ' +
1207
- 'To request a further review of another kind on an item (e.g. security-review), use add_work_item_check.',
1208
- inputSchema: {
1209
- type: 'object',
1210
- properties: {
1211
- work_item_id: {
1212
- type: 'string',
1213
- description: 'The refId of a work item; omit for your reviewer inbox',
1214
- },
1215
- status: {
1216
- type: 'string',
1217
- enum: ['pending', 'passed', 'failed'],
1218
- description: 'Filter by check status',
1219
- },
1220
- kind: {
1221
- type: 'string',
1222
- description: 'Filter by check kind (code-review, security-review, ...). A reviewer that answers one kind lists only that kind.',
1223
- },
1224
- project_slug: {
1225
- type: 'string',
1226
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1227
- },
1228
- },
1229
- },
1230
- },
1231
- {
1232
- name: 'add_work_item_check',
1233
- description: 'Add a pending review check of a kind (e.g. security-review) to a work item you do not lead, so the reviewer that answers that kind picks it up from its inbox. ' +
1234
- "Use it when a change touches a sensitive path and needs a second, specialised review. A case waiting on the item's checks keeps waiting until the new check is resolved. " +
1235
- 'Refused for a kind already pending on the item, for person-only kinds, and on your own work.',
1236
- inputSchema: {
1237
- type: 'object',
1238
- properties: {
1239
- work_item_id: { type: 'string', description: 'The refId of the work item' },
1240
- kind: {
1241
- type: 'string',
1242
- description: 'The check kind to add, e.g. security-review',
1243
- },
1244
- comment: {
1245
- type: 'string',
1246
- description: 'Why the check is being requested — posted as a comment on the item',
1247
- },
1248
- project_slug: {
1249
- type: 'string',
1250
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1251
- },
1252
- },
1253
- required: ['work_item_id', 'kind'],
1254
- },
1255
- },
1256
- {
1257
- name: 'claim_work_item_check',
1258
- description: 'Claim a pending, unclaimed review check on a work item so other reviewers know it is being handled. ' +
1259
- 'Only one reviewer can hold a check; the claim is refused if someone else got there first.',
1260
- inputSchema: {
1261
- type: 'object',
1262
- properties: {
1263
- work_item_id: { type: 'string', description: 'The refId of the work item' },
1264
- check_id: {
1265
- type: 'string',
1266
- description: 'The check ID (checkId from list_work_item_checks)',
1267
- },
1268
- project_slug: {
1269
- type: 'string',
1270
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1271
- },
1272
- },
1273
- required: ['work_item_id', 'check_id'],
1274
- },
1275
- },
1276
- {
1277
- name: 'complete_work_item_check',
1278
- description: 'Record the verdict on a review check: "passed" or "failed", with a short summary of the findings. ' +
1279
- 'A claimed check can only be completed by its claimant (or an admin). When every check on the item is ' +
1280
- 'resolved the owning procedure continues — with a failed check it returns the item to the developer with the summaries as feedback.',
1281
- inputSchema: {
1282
- type: 'object',
1283
- properties: {
1284
- work_item_id: { type: 'string', description: 'The refId of the work item' },
1285
- check_id: {
1286
- type: 'string',
1287
- description: 'The check ID (checkId from list_work_item_checks)',
1288
- },
1289
- status: { type: 'string', enum: ['passed', 'failed'], description: 'The verdict' },
1290
- summary: {
1291
- type: 'string',
1292
- description: 'Short summary of the review findings (what was checked, what failed)',
1293
- },
1294
- project_slug: {
1295
- type: 'string',
1296
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1297
- },
1298
- },
1299
- required: ['work_item_id', 'check_id', 'status'],
1300
- },
1301
- },
1302
- {
1303
- name: 'set_work_item_dependencies',
1304
- description: 'Record which work items must finish before this one can start, so the board knows the order ' +
1305
- 'and the pickup gate enforces it. Use this when you file or plan a set of ordered items, instead ' +
1306
- 'of writing "Follows #2322" into a description — a description is prose nothing enforces. ' +
1307
- 'A bare #N is a WORK ITEM refId, and depends_on takes those reference numbers. ' +
1308
- 'REPLACES the whole set: pass every prerequisite you want the item to have, and [] to clear it. ' +
1309
- 'An item may not depend on itself, nor on anything that already depends on it — either would leave ' +
1310
- 'it permanently blocked, and both are refused with 400 naming the item. ' +
1311
- 'Requires the mcp:work_items:manage_dependencies permission, which is separate from ' +
1312
- "mcp:work_items:update: updating your own item does not let you order other people's work. " +
1313
- 'Returns what the item now depends on, what follows it, and which prerequisites are still unfinished.',
1314
- inputSchema: {
1315
- type: 'object',
1316
- properties: {
1317
- work_item_id: {
1318
- type: 'string',
1319
- description: 'The refId of the work item that follows the others',
1320
- },
1321
- depends_on: {
1322
- type: 'array',
1323
- items: { type: ['number', 'string'] },
1324
- description: 'Reference numbers of the prerequisites, as 2322 or "#2322". Replaces the whole set; pass [] to clear.',
1325
- },
1326
- project_slug: {
1327
- type: 'string',
1328
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1329
- },
1330
- },
1331
- required: ['work_item_id', 'depends_on'],
1332
- },
1333
- },
1334
- {
1335
- name: 'get_work_item_dependency_graph',
1336
- description: 'The whole chain of ordered work around one work item — the prerequisites above it and the work ' +
1337
- 'that follows below — as nodes and edges, each item appearing exactly once. An edge runs from the ' +
1338
- "item that must finish to the item that waits on it. Use it to see a plan's shape; " +
1339
- "get_work_item already gives one item's own dependsOn, nextItems and blockedBy.",
1340
- inputSchema: {
1341
- type: 'object',
1342
- properties: {
1343
- work_item_id: { type: 'string', description: 'The refId of the work item' },
1344
- project_slug: {
1345
- type: 'string',
1346
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1347
- },
1348
- },
1349
- required: ['work_item_id'],
1350
- },
1351
- },
1352
- // Radar Item (Initiative/Roadmap) tools
1353
- {
1354
- name: 'list_radar_items',
1355
- description: 'List radar items - these are initiatives, epics, or roadmap items that group related work items. Use when user asks about "roadmap", "initiatives", "epics", "projects", "what\'s planned", or "upcoming work". Stage: "now" (current sprint), "next" (upcoming), "later" (future), "pending" (not started), "completed".',
1356
- inputSchema: {
1357
- type: 'object',
1358
- properties: {
1359
- project_slug: {
1360
- type: 'string',
1361
- description: 'Project slug (use list_projects to get slugs)',
1362
- },
1363
- stage: {
1364
- type: 'string',
1365
- enum: ['pending', 'now', 'next', 'later', 'completed'],
1366
- description: 'Filter: "now" (current), "next" (upcoming), "later" (future), "pending", "completed"',
1367
- },
1368
- search: {
1369
- type: 'string',
1370
- description: 'Text search in title and description',
1371
- },
1372
- limit: { type: 'number', description: 'Maximum number of items to return' },
1373
- offset: { type: 'number', description: 'Number of items to skip' },
1374
- },
1375
- },
1376
- },
1377
- {
1378
- name: 'get_radar_item',
1379
- description: 'Get a specific radar item (initiative) by reference number, including its work items and participants. ' +
1380
- 'IMAGES: Image references in the description (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
1381
- inputSchema: {
1382
- type: 'object',
1383
- properties: {
1384
- item_id: {
1385
- type: 'string',
1386
- description: 'The refId (number) of the radar item',
1387
- },
1388
- project_slug: {
1389
- type: 'string',
1390
- description: 'Project slug (required for refId lookup)',
1391
- },
1392
- },
1393
- required: ['item_id'],
1394
- },
1395
- },
1396
- {
1397
- name: 'create_radar_item',
1398
- description: 'Create a new radar/initiative item in your current project. Requires mcp:radar:create permission. ' +
1399
- 'Keep "description" to a short summary; put extended detail in "notes". ' +
1400
- CONTENT_LINKING_HELP,
1401
- inputSchema: {
1402
- type: 'object',
1403
- properties: {
1404
- project_slug: {
1405
- type: 'string',
1406
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1407
- },
1408
- title: { type: 'string', description: 'Title of the radar/initiative item' },
1409
- description: {
1410
- type: 'string',
1411
- description: 'Short summary shown on the roadmap card (1-2 sentences). Put extended detail in notes, not here.',
1412
- },
1413
- notes: {
1414
- type: 'string',
1415
- description: "Extended details shown on the initiative's Notes page (markdown). Use this for long-form content.",
1416
- },
1417
- stage: {
1418
- type: 'string',
1419
- enum: ['pending', 'now', 'next', 'later', 'completed'],
1420
- description: 'Stage: "pending" (not started), "now" (current sprint), "next" (upcoming), "later" (future), "completed"',
1421
- },
1422
- },
1423
- required: ['title', 'stage'],
1424
- },
1425
- },
1426
- {
1427
- name: 'update_radar_item',
1428
- description: 'Update an existing radar/initiative item. Requires mcp:radar:update permission. ' +
1429
- CONTENT_LINKING_HELP,
1430
- inputSchema: {
1431
- type: 'object',
1432
- properties: {
1433
- item_id: {
1434
- type: 'string',
1435
- description: 'The refId (number) of the radar item to update',
1436
- },
1437
- title: { type: 'string', description: 'Updated title' },
1438
- description: {
1439
- type: 'string',
1440
- description: 'Updated short summary (1-2 sentences; extended detail belongs in notes)',
1441
- },
1442
- notes: { type: 'string', description: 'Updated Notes page content (markdown)' },
1443
- stage: {
1444
- type: 'string',
1445
- enum: ['pending', 'now', 'next', 'later', 'completed'],
1446
- description: 'Updated stage',
1447
- },
1448
- project_slug: {
1449
- type: 'string',
1450
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1451
- },
1452
- },
1453
- required: ['item_id'],
1454
- },
1455
- },
1456
- // Issue tools
1457
- {
1458
- name: 'list_issues',
1459
- description: 'List issues from the Issue Tracker. Issues are a SEPARATE system from work items on the Kanban board. ' +
1460
- 'Issues track bugs, feature requests, and other reports that may or may not have associated work items. ' +
1461
- 'Issues are referenced with the #i prefix (e.g. #i5). A bare #N (without prefix) is ALWAYS a work item, NOT an issue. ' +
1462
- 'IMPORTANT: If the user asks about "bugs" or "tasks" in the context of the "board", "kanban", or "backlog", use list_work_items instead - those are work items, not issues. ' +
1463
- 'Only use this tool when the user specifically asks about "issues", the "issue tracker", uses the #i prefix, or is clearly referring to the issue tracking system. ' +
1464
- 'Can filter by status, severity, and type.',
1465
- inputSchema: {
1466
- type: 'object',
1467
- properties: {
1468
- project_slug: {
1469
- type: 'string',
1470
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1471
- },
1472
- status: {
1473
- type: 'string',
1474
- enum: ['open', 'in-progress', 'resolved', 'closed'],
1475
- description: 'Filter: "open" (new/active), "in-progress", "resolved" (fixed), "closed"',
1476
- },
1477
- severity: {
1478
- type: 'string',
1479
- enum: ['low', 'medium', 'high', 'critical'],
1480
- description: 'Filter by severity/priority: "critical", "high", "medium", "low"',
1481
- },
1482
- type: {
1483
- type: 'string',
1484
- enum: ['bug', 'feature-request', 'task', 'improvement', 'question'],
1485
- description: 'Filter: "bug" (defect), "feature-request", "task", "improvement", "question"',
1486
- },
1487
- assigned_to_id: {
1488
- type: 'string',
1489
- description: 'Filter by assignee: "me" (default), "unassigned", "all", or a specific user ID',
1490
- },
1491
- search: {
1492
- type: 'string',
1493
- description: 'Text search in title and description',
1494
- },
1495
- date_from: {
1496
- type: 'string',
1497
- description: 'Filter issues created on or after this date (ISO format, e.g. "2025-01-01")',
1498
- },
1499
- date_to: {
1500
- type: 'string',
1501
- description: 'Filter issues created on or before this date (ISO format, e.g. "2025-12-31")',
1502
- },
1503
- sort_by: {
1504
- type: 'string',
1505
- description: 'Sort field: "dateCreated" (default), "dateUpdated", "severity", "title"',
1506
- },
1507
- sort_order: {
1508
- type: 'string',
1509
- description: 'Sort direction: "desc" (default), "asc"',
1510
- },
1511
- limit: { type: 'number', description: 'Maximum number of items to return' },
1512
- offset: { type: 'number', description: 'Number of items to skip' },
1513
- },
1514
- },
1515
- },
1516
- {
1517
- name: 'get_issue',
1518
- description: 'Get a specific issue by its PREFIXED reference #iN (e.g. #i5). ' +
1519
- 'IMPORTANT: A bare #N (without prefix) is ALWAYS a work item, NOT an issue. Only use this tool when the user explicitly says "issue" or uses the #i prefix. ' +
1520
- 'Returns full details including comment and attachment counts. ' +
1521
- 'IMAGES: Image references in the description (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
1522
- inputSchema: {
1523
- type: 'object',
1524
- properties: {
1525
- issue_id: {
1526
- type: 'string',
1527
- description: 'The refId (number) of the issue',
1528
- },
1529
- project_slug: {
1530
- type: 'string',
1531
- description: 'Project slug (required for refId lookup)',
1532
- },
1533
- },
1534
- required: ['issue_id'],
1535
- },
1536
- },
1537
- // Create/Update tools
1538
- {
1539
- name: 'create_work_item',
1540
- description: 'Create a new work item in your current project (auto-selected for single-project users, or use list_projects first for multi-project). Requires mcp:work_items:create permission. ' +
1541
- 'Agents: work you file lands unassigned in the backlog, whatever status you ask for, and waits there for the Delivery Lead to approve and assign it. ' +
1542
- 'ORDERED WORK: when you file a set of items that must happen in order, give each one depends_on ' +
1543
- 'naming the reference numbers it follows, rather than writing "Follows #2322" into the description — ' +
1544
- 'that way the board knows the order and the pickup gate enforces it. ' +
1545
- CONTENT_LINKING_HELP,
1546
- inputSchema: {
1547
- type: 'object',
1548
- properties: {
1549
- project_slug: {
1550
- type: 'string',
1551
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1552
- },
1553
- title: { type: 'string', description: 'Title of the work item' },
1554
- description: {
1555
- type: 'string',
1556
- description: 'Description/notes for the work item (markdown)',
1557
- },
1558
- status: {
1559
- type: 'string',
1560
- enum: [
1561
- 'pending',
1562
- 'new',
1563
- 'doing',
1564
- 'blocked',
1565
- 'review',
1566
- 'ready',
1567
- 'completed',
1568
- 'closed',
1569
- 'archived',
1570
- ],
1571
- description: 'Initial status: "pending" (backlog), "new" (to do), "doing", "review", "ready", "blocked", "completed", "closed", "archived". Defaults to "new".',
1572
- },
1573
- priority: {
1574
- type: 'number',
1575
- description: 'Priority level (0-4, higher is more important)',
1576
- },
1577
- size: {
1578
- type: 'string',
1579
- enum: ['S', 'M', 'L'],
1580
- description: 'Size estimate: "S" (small), "M" (medium), "L" (large)',
1581
- },
1582
- leading_user_id: {
1583
- type: 'string',
1584
- description: "User ID to assign as leading user. Agents may not assign work to themselves — that is the Delivery Lead's decision.",
1585
- },
1586
- category_id: {
1587
- type: 'string',
1588
- description: 'Category ID to organize the work item',
1589
- },
1590
- radar_item_id: {
1591
- type: 'string',
1592
- description: 'Link to a radar/initiative item. Accepts refId (e.g. "5" or "#r5") or UUID.',
1593
- },
1594
- depends_on: {
1595
- type: 'array',
1596
- items: { type: ['number', 'string'] },
1597
- description: 'Reference numbers of work items that must finish before this one starts, as 2322 or "#2322". Filing an ordered set one call each needs mcp:work_items:manage_dependencies.',
1598
- },
1599
- },
1600
- required: ['title'],
1601
- },
1602
- },
1603
- {
1604
- name: 'create_issue',
1605
- description: 'Create a new issue in your current project (auto-selected for single-project users, or use list_projects first for multi-project). Requires mcp:issues:create permission. ' +
1606
- 'Agents: not for you. Issues are how the people using the product report problems they hit — file what you found with create_work_item instead. ' +
1607
- CONTENT_LINKING_HELP,
1608
- inputSchema: {
1609
- type: 'object',
1610
- properties: {
1611
- project_slug: {
1612
- type: 'string',
1613
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1614
- },
1615
- title: { type: 'string', description: 'Title of the issue' },
1616
- description: { type: 'string', description: 'Description of the issue' },
1617
- severity: {
1618
- type: 'string',
1619
- enum: ['low', 'medium', 'high', 'critical'],
1620
- description: 'Severity level',
1621
- },
1622
- type: {
1623
- type: 'string',
1624
- enum: ['bug', 'feature-request', 'task', 'improvement', 'question'],
1625
- description: 'Issue type',
1626
- },
1627
- assigned_to_id: { type: 'string', description: 'User ID to assign the issue to' },
1628
- environment: {
1629
- type: 'string',
1630
- description: 'Environment where the issue occurred',
1631
- },
1632
- affected_version: { type: 'string', description: 'Version affected by the issue' },
1633
- reproducible: { type: 'boolean', description: 'Whether the issue is reproducible' },
1634
- steps_to_reproduce: { type: 'string', description: 'Steps to reproduce the issue' },
1635
- expected_behavior: { type: 'string', description: 'Expected behavior' },
1636
- actual_behavior: { type: 'string', description: 'Actual behavior observed' },
1637
- },
1638
- required: ['title'],
1639
- },
1640
- },
1641
- {
1642
- name: 'update_issue',
1643
- description: 'Update an existing issue. Requires mcp:issues:update permission. ' +
1644
- 'TAGS: pass `tags` (names from list_tags) to replace the whole tag set; an ' +
1645
- 'empty array clears it. Tagging an issue that is not assigned to you needs ' +
1646
- 'mcp:issues:tag_all, and that scope allows a tags-only update — send any other ' +
1647
- 'field alongside and the usual assignment rule applies. ' +
1648
- CONTENT_LINKING_HELP,
1649
- inputSchema: {
1650
- type: 'object',
1651
- properties: {
1652
- issue_id: {
1653
- type: 'string',
1654
- description: 'The refId (number) of the issue to update',
1655
- },
1656
- title: { type: 'string', description: 'Updated title' },
1657
- description: { type: 'string', description: 'Updated description' },
1658
- status: {
1659
- type: 'string',
1660
- enum: ['open', 'in-progress', 'resolved', 'closed'],
1661
- description: 'Updated status',
1662
- },
1663
- severity: {
1664
- type: 'string',
1665
- enum: ['low', 'medium', 'high', 'critical'],
1666
- description: 'Updated severity',
1667
- },
1668
- type: {
1669
- type: 'string',
1670
- enum: ['bug', 'feature-request', 'task', 'improvement', 'question'],
1671
- description: 'Updated type',
1672
- },
1673
- assigned_to_id: { type: 'string', description: 'Updated assignee' },
1674
- closing_note: {
1675
- type: 'string',
1676
- description: 'Closing note (when closing the issue)',
1677
- },
1678
- environment: {
1679
- type: 'string',
1680
- description: 'Environment where the issue occurred',
1681
- },
1682
- affected_version: { type: 'string', description: 'Affected version' },
1683
- reproducible: { type: 'boolean', description: 'Whether reproducible' },
1684
- steps_to_reproduce: { type: 'string', description: 'Steps to reproduce' },
1685
- expected_behavior: { type: 'string', description: 'Expected behavior' },
1686
- actual_behavior: { type: 'string', description: 'Actual behavior' },
1687
- tags: {
1688
- type: 'array',
1689
- items: { type: 'string' },
1690
- description: 'Tag names to apply (replaces existing tags). Use list_tags to see available tags.',
1691
- },
1692
- project_slug: {
1693
- type: 'string',
1694
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1695
- },
1696
- },
1697
- required: ['issue_id'],
1698
- },
1699
- },
1700
- // Wiki Page tools
1701
- {
1702
- name: 'list_wiki_pages',
1703
- description: 'List wiki pages (documentation, docs, knowledge base). Use when user asks about "docs", "documentation", "wiki", "knowledge base", or "how-to guides".',
1704
- inputSchema: {
1705
- type: 'object',
1706
- properties: {
1707
- project_slug: {
1708
- type: 'string',
1709
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1710
- },
1711
- search: {
1712
- type: 'string',
1713
- description: 'Text search in title and content',
1714
- },
1715
- date_from: {
1716
- type: 'string',
1717
- description: 'Filter pages updated on or after this date (ISO format, e.g. "2025-01-01")',
1718
- },
1719
- date_to: {
1720
- type: 'string',
1721
- description: 'Filter pages updated on or before this date (ISO format, e.g. "2025-12-31")',
1722
- },
1723
- limit: { type: 'number', description: 'Maximum number of pages to return' },
1724
- offset: { type: 'number', description: 'Number of pages to skip' },
1725
- },
1726
- },
1727
- },
1728
- {
1729
- name: 'get_wiki_page',
1730
- description: 'Get a specific wiki/documentation page by slug (URL path). Returns full content in markdown. ' +
1731
- 'IMAGES: Image references in the content (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
1732
- inputSchema: {
1733
- type: 'object',
1734
- properties: {
1735
- page_id: {
1736
- type: 'string',
1737
- description: 'The page slug (URL path like "getting-started")',
1738
- },
1739
- },
1740
- required: ['page_id'],
1741
- },
1742
- },
1743
- {
1744
- name: 'create_wiki_page',
1745
- description: 'Create a new wiki/documentation page. Use when user wants to "add docs", "create documentation", or "write a guide". ' +
1746
- CONTENT_LINKING_HELP,
1747
- inputSchema: {
1748
- type: 'object',
1749
- properties: {
1750
- project_slug: {
1751
- type: 'string',
1752
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1753
- },
1754
- slug: {
1755
- type: 'string',
1756
- description: 'URL slug for the page (without team prefix). The system automatically prepends the team and wiki path. For example, to create a page at "myteam/wiki/guides/onboarding", pass just "guides/onboarding". Do NOT include the team slug or "wiki/" prefix.',
1757
- },
1758
- title: { type: 'string', description: 'Page title' },
1759
- content: {
1760
- type: 'string',
1761
- description: 'Page content (markdown)',
1762
- },
1763
- },
1764
- required: ['slug', 'title', 'content'],
1765
- },
1766
- },
1767
- {
1768
- name: 'update_wiki_page',
1769
- description: 'Update an existing wiki page. Requires mcp:wiki:update permission. ' +
1770
- CONTENT_LINKING_HELP,
1771
- inputSchema: {
1772
- type: 'object',
1773
- properties: {
1774
- page_id: { type: 'string', description: 'The page slug' },
1775
- title: { type: 'string', description: 'Updated title' },
1776
- content: {
1777
- type: 'string',
1778
- description: 'Updated content (markdown)',
1779
- },
1780
- tag_ids: {
1781
- type: 'array',
1782
- items: { type: 'string' },
1783
- description: 'Tag IDs to apply to the page (replaces existing tags)',
1784
- },
1785
- project_slug: {
1786
- type: 'string',
1787
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1788
- },
1789
- },
1790
- required: ['page_id'],
1791
- },
1792
- },
1793
- // Journal Entry tools
1794
- {
1795
- name: 'list_journal_entries',
1796
- description: 'List journal entries (daily logs, standup notes, progress updates). Use when user asks about "journal", "daily log", "standup notes", "progress updates", or "what did I work on".',
1797
- inputSchema: {
1798
- type: 'object',
1799
- properties: {
1800
- project_slug: {
1801
- type: 'string',
1802
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1803
- },
1804
- search: {
1805
- type: 'string',
1806
- description: 'Text search in title and content',
1807
- },
1808
- date_from: {
1809
- type: 'string',
1810
- description: 'Filter entries dated on or after this date (ISO format, e.g. "2025-01-01")',
1811
- },
1812
- date_to: {
1813
- type: 'string',
1814
- description: 'Filter entries dated on or before this date (ISO format, e.g. "2025-12-31")',
1815
- },
1816
- limit: { type: 'number', description: 'Maximum number of entries to return' },
1817
- offset: { type: 'number', description: 'Number of entries to skip' },
1818
- },
1819
- },
1820
- },
1821
- {
1822
- name: 'get_journal_entry',
1823
- description: 'Get a specific journal/log entry by reference number. Returns full content. ' +
1824
- 'IMAGES: Image references in the content (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
1825
- inputSchema: {
1826
- type: 'object',
1827
- properties: {
1828
- entry_id: { type: 'string', description: 'The entry refId (number)' },
1829
- project_slug: {
1830
- type: 'string',
1831
- description: 'Project slug (required for refId lookup)',
1832
- },
1833
- },
1834
- required: ['entry_id'],
1835
- },
1836
- },
1837
- {
1838
- name: 'create_journal_entry',
1839
- description: 'Create a new journal entry (daily log, standup note, progress update). Use when user wants to "log progress", "write a standup", "add a journal entry", or "record what I did". ' +
1840
- CONTENT_LINKING_HELP,
1841
- inputSchema: {
1842
- type: 'object',
1843
- properties: {
1844
- project_slug: {
1845
- type: 'string',
1846
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1847
- },
1848
- title: { type: 'string', description: 'Entry title' },
1849
- content: {
1850
- type: 'string',
1851
- description: 'Entry content (markdown)',
1852
- },
1853
- },
1854
- required: ['title', 'content'],
1855
- },
1856
- },
1857
- {
1858
- name: 'update_journal_entry',
1859
- description: 'Update an existing journal entry. Requires mcp:journal:update permission. ' +
1860
- CONTENT_LINKING_HELP,
1861
- inputSchema: {
1862
- type: 'object',
1863
- properties: {
1864
- entry_id: { type: 'string', description: 'The entry refId (number)' },
1865
- title: { type: 'string', description: 'Updated title' },
1866
- content: {
1867
- type: 'string',
1868
- description: 'Updated content (markdown)',
1869
- },
1870
- tag_ids: {
1871
- type: 'array',
1872
- items: { type: 'string' },
1873
- description: 'Tag IDs to apply (replaces existing tags)',
1874
- },
1875
- project_slug: {
1876
- type: 'string',
1877
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1878
- },
1879
- },
1880
- required: ['entry_id'],
1881
- },
1882
- },
1883
- // Comment tools
1884
- {
1885
- name: 'list_work_item_comments',
1886
- description: 'List all comments on a work item. Returns comments in chronological order. Requires mcp:comments:read permission. ' +
1887
- 'IMAGES: Image references in comments (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
1888
- inputSchema: {
1889
- type: 'object',
1890
- properties: {
1891
- work_item_id: { type: 'string', description: 'The work item refId (number)' },
1892
- project_slug: {
1893
- type: 'string',
1894
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1895
- },
1896
- },
1897
- required: ['work_item_id'],
1898
- },
1899
- },
1900
- {
1901
- name: 'list_issue_comments',
1902
- description: 'List all comments on an issue. Returns comments in chronological order. Requires mcp:comments:read permission. ' +
1903
- 'IMAGES: Image references in comments (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
1904
- inputSchema: {
1905
- type: 'object',
1906
- properties: {
1907
- issue_id: { type: 'string', description: 'The issue refId (number)' },
1908
- project_slug: {
1909
- type: 'string',
1910
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1911
- },
1912
- },
1913
- required: ['issue_id'],
1914
- },
1915
- },
1916
- {
1917
- name: 'create_work_item_comment',
1918
- description: 'Add a comment to a work item. Requires mcp:comments:create permission. ' +
1919
- 'USE COMMENTS FOR: 1) Blocking reasons when moving to "blocked" (what failed, what was tried, what is needed). ' +
1920
- '2) Completion summaries when moving to "review" (what was done, files changed, testing notes). ' +
1921
- '3) Important observations or decisions that should be visible in the activity history. ' +
1922
- 'USE DESCRIPTION (update_work_progress) FOR: Plans, checklists, and progress tracking that need to be updated over time. ' +
1923
- 'NOT FOR QUESTIONS you need answered before you can continue the item you are working: a reply cannot reach a ' +
1924
- 'running session, so a question asked here is one you keep working past. Use ask_work_item_question, which pauses the work. ' +
1925
- 'Comments are typically not used in personal projects. ' +
1926
- CONTENT_LINKING_HELP,
1927
- inputSchema: {
1928
- type: 'object',
1929
- properties: {
1930
- work_item_id: { type: 'string', description: 'The work item refId (number)' },
1931
- content: {
1932
- type: 'string',
1933
- description: 'Comment content (markdown)',
1934
- },
1935
- project_slug: {
1936
- type: 'string',
1937
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1938
- },
1939
- },
1940
- required: ['work_item_id', 'content'],
1941
- },
1942
- },
1943
- {
1944
- name: 'ask_work_item_question',
1945
- description: 'Ask a question about the work item you are working on and PAUSE until it is answered. ' +
1946
- 'For when you cannot sensibly continue without an answer from a person — an ambiguous requirement, a decision ' +
1947
- 'that is theirs to make, something only they know. The question is posted as a comment addressed to the ' +
1948
- 'item\'s creator, and the item is marked as waiting: it stays in "doing" with you, your schedule does not ' +
1949
- 'wake you for it until someone else comments (that comment is the answer), and the session ending on it is ' +
1950
- 'not counted as an abandonment. AFTER CALLING THIS, STOP: commit and push anything worth keeping, make sure ' +
1951
- 'the plan in the description records where you got to, and end your session without taking other work — ' +
1952
- 'a reply cannot reach a running session, and pull_work_item refuses while the item waits. When you are ' +
1953
- "woken again, get_work_item shows the question and its answer. Only the item's leading user may ask, and " +
1954
- 'only while the item is in "doing". In a chat session ask in your reply instead — the next message is the answer. ' +
1955
- 'Requires mcp:work_items:update permission.',
1956
- inputSchema: {
1957
- type: 'object',
1958
- properties: {
1959
- work_item_id: { type: 'string', description: 'The work item refId (number)' },
1960
- question: {
1961
- type: 'string',
1962
- description: 'The question (markdown). Give the context a reader needs to answer it in one reply: what you found, the options you see, what you would do by default.',
1963
- },
1964
- project_slug: {
1965
- type: 'string',
1966
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1967
- },
1968
- },
1969
- required: ['work_item_id', 'question'],
1970
- },
1971
- },
1972
- {
1973
- name: 'create_issue_comment',
1974
- description: 'Add a comment to an issue. Requires mcp:comments:create permission. ' +
1975
- CONTENT_LINKING_HELP,
1976
- inputSchema: {
1977
- type: 'object',
1978
- properties: {
1979
- issue_id: { type: 'string', description: 'The issue refId (number)' },
1980
- content: {
1981
- type: 'string',
1982
- description: 'Comment content (markdown)',
1983
- },
1984
- project_slug: {
1985
- type: 'string',
1986
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1987
- },
1988
- },
1989
- required: ['issue_id', 'content'],
1990
- },
1991
- },
1992
- {
1993
- name: 'delete_work_item_comment',
1994
- description: 'Delete a comment from a work item. The comment author or a team admin can delete a comment. ' +
1995
- 'Requires mcp:comments:delete permission. Use list_work_item_comments to get comment IDs.',
1996
- inputSchema: {
1997
- type: 'object',
1998
- properties: {
1999
- work_item_id: { type: 'string', description: 'The work item refId (number)' },
2000
- comment_id: { type: 'string', description: 'The comment ID to delete' },
2001
- project_slug: {
2002
- type: 'string',
2003
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2004
- },
2005
- },
2006
- required: ['work_item_id', 'comment_id'],
2007
- },
2008
- },
2009
- {
2010
- name: 'delete_issue_comment',
2011
- description: 'Delete a comment from an issue. The comment author or a team admin can delete a comment. ' +
2012
- 'Requires mcp:comments:delete permission. Use list_issue_comments to get comment IDs.',
2013
- inputSchema: {
2014
- type: 'object',
2015
- properties: {
2016
- issue_id: { type: 'string', description: 'The issue refId (number)' },
2017
- comment_id: { type: 'string', description: 'The comment ID to delete' },
2018
- project_slug: {
2019
- type: 'string',
2020
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2021
- },
2022
- },
2023
- required: ['issue_id', 'comment_id'],
2024
- },
2025
- },
2026
- // Image tools
2027
- {
2028
- name: 'upload_image',
2029
- description: 'Upload an image file from disk and get back a permanent URL. ' +
2030
- 'Reads the file directly from disk. ' +
2031
- 'Returns a markdown image URL you can include in any content field. ' +
2032
- 'IMPORTANT: This tool requires direct filesystem access and may not work in sandboxed environments (e.g. Claude.ai, Claude Desktop). ' +
2033
- 'If the MCP server cannot access the file path, inform the user that image uploads are not supported in their environment. ' +
2034
- 'Requires mcp:images:upload permission.',
2035
- inputSchema: {
2036
- type: 'object',
2037
- properties: {
2038
- file_path: {
2039
- type: 'string',
2040
- description: 'Absolute path to an image file on disk (e.g., "/tmp/screenshot.png"). ' +
2041
- 'Supported formats: JPEG, PNG, GIF, WebP. Max 5MB.',
2042
- },
2043
- project_slug: {
2044
- type: 'string',
2045
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2046
- },
2047
- },
2048
- required: ['file_path'],
2049
- },
2050
- },
2051
- {
2052
- name: 'download_image',
2053
- description: 'Download and view an image referenced in content fields. ' +
2054
- 'Content from work items, issues, wiki pages, journal entries, and comments may contain image references like `![alt](/api/files/{fileId}/...)` or the legacy `![alt](/api/files/images/...)`. ' +
2055
- 'Issues may also have attachment images with URLs like `/api/teams/{team}/issues/{refId}/attachments/{id}`. ' +
2056
- 'Use this tool with that URL path to download and view the image. ' +
2057
- 'Requires mcp:images:read permission.',
2058
- inputSchema: {
2059
- type: 'object',
2060
- properties: {
2061
- image_url: {
2062
- type: 'string',
2063
- description: 'The image URL path found in content fields (e.g. "/api/files/{fileId}/{filename}", legacy "/api/files/images/{team}/{filename}", or "/api/teams/{team}/issues/{refId}/attachments/{id}").',
2064
- },
2065
- },
2066
- required: ['image_url'],
2067
- },
2068
- },
2069
- // Category tools
2070
- {
2071
- name: 'list_categories',
2072
- description: 'List all categories available in a project. Returns category IDs, names, and descriptions. ' +
2073
- 'Use this to look up category IDs by name when creating or updating work items.',
2074
- inputSchema: {
2075
- type: 'object',
2076
- properties: {
2077
- project_slug: {
2078
- type: 'string',
2079
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2080
- },
2081
- },
2082
- },
2083
- },
2084
- // Work pool tools (#2083)
2085
- {
2086
- name: 'list_work_pools',
2087
- description: 'List the work pools in a project with their members. Reviewer and DevOps agents find their checks through pool membership, so this is how to see who is routed where.',
2088
- inputSchema: {
2089
- type: 'object',
2090
- properties: {
2091
- project_slug: {
2092
- type: 'string',
2093
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2094
- },
2095
- },
2096
- },
2097
- },
2098
- {
2099
- name: 'add_work_pool_member',
2100
- description: "Add a user or agent (by user id, e.g. an agent profile's userId) to a work pool, named by id or name. Requires mcp:agents:update.",
2101
- inputSchema: {
2102
- type: 'object',
2103
- properties: {
2104
- work_pool: { type: 'string', description: 'Work pool id or name' },
2105
- user_id: { type: 'string', description: 'The user id to add' },
2106
- project_slug: {
2107
- type: 'string',
2108
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2109
- },
2110
- },
2111
- required: ['work_pool', 'user_id'],
2112
- },
2113
- },
2114
- {
2115
- name: 'remove_work_pool_member',
2116
- description: 'Remove a user or agent from a work pool. Requires mcp:agents:update.',
2117
- inputSchema: {
2118
- type: 'object',
2119
- properties: {
2120
- work_pool: { type: 'string', description: 'Work pool id or name' },
2121
- user_id: { type: 'string', description: 'The user id to remove' },
2122
- project_slug: {
2123
- type: 'string',
2124
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2125
- },
2126
- },
2127
- required: ['work_pool', 'user_id'],
2128
- },
2129
- },
2130
- // Tag tools
2131
- {
2132
- name: 'list_tags',
2133
- description: 'List all tags of a project: id, name, colour, external id, the group each is filed under, and whether it is archived. ' +
2134
- 'Items are tagged by name via update_work_item / update_issue; archived tags cannot be applied. ' +
2135
- 'A sync from an external system (e.g. a CRM) keys on externalId.',
2136
- inputSchema: {
2137
- type: 'object',
2138
- properties: {
2139
- project_slug: {
2140
- type: 'string',
2141
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2142
- },
2143
- },
2144
- },
2145
- },
2146
- {
2147
- name: 'create_tag',
2148
- description: 'Create a tag in a project. Project admins only (mcp:tags:manage). ' +
2149
- 'Set external_id when the tag mirrors a record in another system, so a later sync can find it by id rather than name.',
2150
- inputSchema: {
2151
- type: 'object',
2152
- properties: {
2153
- project_slug: {
2154
- type: 'string',
2155
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2156
- },
2157
- name: { type: 'string', description: 'Tag name, unique within the project' },
2158
- colour: { type: 'string', description: 'Hex colour such as #e879f9 (optional)' },
2159
- group: {
2160
- type: 'string',
2161
- description: 'Tag group name or id to file the tag under (optional, see list_tag_groups)',
2162
- },
2163
- external_id: {
2164
- type: 'string',
2165
- description: 'Id of this tag in the system that maintains it, unique within the project (optional)',
2166
- },
2167
- },
2168
- required: ['name'],
2169
- },
2170
- },
2171
- {
2172
- name: 'update_tag',
2173
- description: 'Rename, recolour, regroup, re-key or archive a tag. Project admins only (mcp:tags:manage). ' +
2174
- 'Only the fields given change; pass null for colour, group or external_id to clear it. ' +
2175
- 'archived: true is the soft delete — the tag stays on the items that carry it but no picker offers it; archived: false restores it.',
2176
- inputSchema: {
2177
- type: 'object',
2178
- properties: {
2179
- project_slug: {
2180
- type: 'string',
2181
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2182
- },
2183
- tag: { type: 'string', description: 'Tag id or current name' },
2184
- name: { type: 'string', description: 'New name' },
2185
- colour: { type: ['string', 'null'], description: 'Hex colour, or null to clear' },
2186
- group: {
2187
- type: ['string', 'null'],
2188
- description: 'Tag group name or id, or null to move the tag out of its group',
2189
- },
2190
- external_id: {
2191
- type: ['string', 'null'],
2192
- description: 'External id, or null to clear',
2193
- },
2194
- archived: {
2195
- type: 'boolean',
2196
- description: 'true archives the tag (soft delete), false restores it',
2197
- },
2198
- },
2199
- required: ['tag'],
2200
- },
2201
- },
2202
- {
2203
- name: 'list_tag_groups',
2204
- description: 'List the tag groups of a project with their parent and full path (groups nest, e.g. "Customers › EMEA").',
2205
- inputSchema: {
2206
- type: 'object',
2207
- properties: {
2208
- project_slug: {
2209
- type: 'string',
2210
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2211
- },
2212
- },
2213
- },
2214
- },
2215
- {
2216
- name: 'create_tag_group',
2217
- description: 'Create a tag group, optionally inside a parent group. Project admins only (mcp:tags:manage).',
2218
- inputSchema: {
2219
- type: 'object',
2220
- properties: {
2221
- project_slug: {
2222
- type: 'string',
2223
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2224
- },
2225
- name: { type: 'string', description: 'Group name, unique within the project' },
2226
- parent: { type: 'string', description: 'Parent group name or id (optional)' },
2227
- },
2228
- required: ['name'],
2229
- },
2230
- },
2231
- {
2232
- name: 'update_tag_group',
2233
- description: 'Rename a tag group or move it under another parent. Project admins only (mcp:tags:manage). ' +
2234
- 'Pass parent: null for the top level.',
2235
- inputSchema: {
2236
- type: 'object',
2237
- properties: {
2238
- project_slug: {
2239
- type: 'string',
2240
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2241
- },
2242
- group: { type: 'string', description: 'Group id or current name' },
2243
- name: { type: 'string', description: 'New name' },
2244
- parent: {
2245
- type: ['string', 'null'],
2246
- description: 'Parent group name or id, or null for the top level',
2247
- },
2248
- },
2249
- required: ['group'],
2250
- },
2251
- },
2252
- // Team member tools
2253
- {
2254
- name: 'list_team_members',
2255
- description: 'List all members in a project/team. Returns user IDs, names, usernames, roles, and whether the member is an agent. ' +
2256
- 'Use this to look up user IDs when assigning work items or issues.',
2257
- inputSchema: {
2258
- type: 'object',
2259
- properties: {
2260
- project_slug: {
2261
- type: 'string',
2262
- description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
2263
- },
2264
- },
2265
- },
2266
- },
2267
- // Skill tools (progressive disclosure)
2268
- {
2269
- name: 'list_skills',
2270
- description: 'List all skills available to the current agent. Returns lean metadata (name + description) for each skill. ' +
2271
- 'Use get_skill to load the full instructions for a specific skill when needed.',
2272
- inputSchema: {
2273
- type: 'object',
2274
- properties: {},
2275
- },
2276
- },
2277
- {
2278
- name: 'get_skill',
2279
- description: 'Load the full instruction content for a specific skill by name. ' +
2280
- "Call this when a task matches a skill's description to get detailed instructions before proceeding. " +
2281
- 'Also returns a list of available resources (scripts, references, assets).',
2282
- inputSchema: {
2283
- type: 'object',
2284
- properties: {
2285
- skill_name: {
2286
- type: 'string',
2287
- description: 'The name of the skill to load (e.g. "deploy-app")',
2288
- },
2289
- },
2290
- required: ['skill_name'],
2291
- },
2292
- },
2293
- {
2294
- name: 'get_skill_resource',
2295
- description: 'Get a specific resource file attached to a skill. ' +
2296
- 'Resources can be scripts, reference documents, or assets that supplement the skill instructions.',
2297
- inputSchema: {
2298
- type: 'object',
2299
- properties: {
2300
- skill_name: {
2301
- type: 'string',
2302
- description: 'The name of the skill',
2303
- },
2304
- resource_name: {
2305
- type: 'string',
2306
- description: 'The name of the resource file',
2307
- },
2308
- },
2309
- required: ['skill_name', 'resource_name'],
2310
- },
2311
- },
2312
- // Notification tools
2313
- {
2314
- name: 'list_notifications',
2315
- description: 'List your notifications. Returns notifications with type, title, message, read status, and linked items (work items, issues). ' +
2316
- 'Notification types include: mention, assignment, comment, status_change, team_invite, page_update, nomination, reaction. ' +
2317
- 'Use unread_only=true to see only unread notifications. Supports pagination with limit/offset.',
2318
- inputSchema: {
2319
- type: 'object',
2320
- properties: {
2321
- unread_only: {
2322
- type: 'boolean',
2323
- description: 'If true, only return unread notifications',
2324
- },
2325
- limit: {
2326
- type: 'number',
2327
- description: 'Maximum number of notifications to return (default 20)',
2328
- },
2329
- offset: {
2330
- type: 'number',
2331
- description: 'Number of notifications to skip for pagination',
2332
- },
2333
- },
2334
- },
2335
- },
2336
- {
2337
- name: 'mark_notification_read',
2338
- description: 'Mark a specific notification as read. Use this after processing a notification to prevent re-processing.',
2339
- inputSchema: {
2340
- type: 'object',
2341
- properties: {
2342
- notification_id: {
2343
- type: 'string',
2344
- description: 'The ID of the notification to mark as read',
2345
- },
2346
- },
2347
- required: ['notification_id'],
2348
- },
2349
- },
2350
- {
2351
- name: 'mark_all_notifications_read',
2352
- description: 'Mark all of your unread notifications as read.',
2353
- inputSchema: {
2354
- type: 'object',
2355
- properties: {},
2356
- },
2357
- },
2358
- {
2359
- name: 'delete_notification',
2360
- description: 'Delete a specific notification permanently.',
2361
- inputSchema: {
2362
- type: 'object',
2363
- properties: {
2364
- notification_id: {
2365
- type: 'string',
2366
- description: 'The ID of the notification to delete',
2367
- },
2368
- },
2369
- required: ['notification_id'],
2370
- },
2371
- },
2372
- // Subscription tools
2373
- {
2374
- name: 'list_subscriptions',
2375
- description: 'List your document subscriptions. Subscriptions control which documents you receive notifications for. ' +
2376
- 'Each subscription shows the document type, notification preferences (mentions, edits, comments, status), mute status, and reason for subscribing. ' +
2377
- 'Filter by document_type to see subscriptions for a specific type (e.g. "work_item", "issue", "wiki_page").',
2378
- inputSchema: {
2379
- type: 'object',
2380
- properties: {
2381
- document_type: {
2382
- type: 'string',
2383
- enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
2384
- description: 'Filter by document type',
2385
- },
2386
- is_active: {
2387
- type: 'boolean',
2388
- description: 'Filter by active status',
2389
- },
2390
- },
2391
- },
2392
- },
2393
- {
2394
- name: 'subscribe',
2395
- description: 'Subscribe to a document to receive notifications about it. ' +
2396
- 'You can configure which notification types to receive: mentions, edits, comments, and status changes. ' +
2397
- 'Supported document types: wiki_page, work_item, radar_item, issue, journal, discussion.',
2398
- inputSchema: {
2399
- type: 'object',
2400
- properties: {
2401
- document_type: {
2402
- type: 'string',
2403
- enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
2404
- description: 'Type of document to subscribe to',
2405
- },
2406
- document_id: {
2407
- type: 'string',
2408
- description: 'The ID of the document to subscribe to',
2409
- },
2410
- reason: {
2411
- type: 'string',
2412
- description: 'Reason for subscribing (default: "watched")',
2413
- },
2414
- notify_on_mentions: {
2415
- type: 'boolean',
2416
- description: 'Notify when mentioned in this document',
2417
- },
2418
- notify_on_edits: {
2419
- type: 'boolean',
2420
- description: 'Notify when the document is edited',
2421
- },
2422
- notify_on_comments: {
2423
- type: 'boolean',
2424
- description: 'Notify on new comments',
2425
- },
2426
- notify_on_status: {
2427
- type: 'boolean',
2428
- description: 'Notify on status changes',
2429
- },
2430
- cooldown_minutes: {
2431
- type: 'number',
2432
- description: 'Minimum minutes between notifications',
2433
- },
2434
- },
2435
- required: ['document_type', 'document_id'],
2436
- },
2437
- },
2438
- {
2439
- name: 'unsubscribe',
2440
- description: 'Unsubscribe from a document (soft delete). Stops notifications but keeps the subscription record. ' +
2441
- 'The subscription can be reactivated by subscribing again.',
2442
- inputSchema: {
2443
- type: 'object',
2444
- properties: {
2445
- document_type: {
2446
- type: 'string',
2447
- enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
2448
- description: 'Type of document to unsubscribe from',
2449
- },
2450
- document_id: {
2451
- type: 'string',
2452
- description: 'The ID of the document to unsubscribe from',
2453
- },
2454
- },
2455
- required: ['document_type', 'document_id'],
2456
- },
2457
- },
2458
- {
2459
- name: 'mute_subscription',
2460
- description: 'Temporarily mute notifications from a subscription. The subscription remains active but notifications are silenced. ' +
2461
- 'Specify duration in minutes, or omit for indefinite mute. Use unmute_subscription to resume.',
2462
- inputSchema: {
2463
- type: 'object',
2464
- properties: {
2465
- document_type: {
2466
- type: 'string',
2467
- enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
2468
- description: 'Type of document',
2469
- },
2470
- document_id: {
2471
- type: 'string',
2472
- description: 'The ID of the document',
2473
- },
2474
- duration: {
2475
- type: 'number',
2476
- description: 'Duration in minutes to mute (omit for indefinite)',
2477
- },
2478
- },
2479
- required: ['document_type', 'document_id'],
2480
- },
2481
- },
2482
- {
2483
- name: 'unmute_subscription',
2484
- description: 'Unmute a subscription to resume receiving notifications.',
2485
- inputSchema: {
2486
- type: 'object',
2487
- properties: {
2488
- document_type: {
2489
- type: 'string',
2490
- enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
2491
- description: 'Type of document',
2492
- },
2493
- document_id: {
2494
- type: 'string',
2495
- description: 'The ID of the document',
2496
- },
2497
- },
2498
- required: ['document_type', 'document_id'],
2499
- },
2500
- },
2501
- // Discussion tools
2502
- {
2503
- name: 'get_discussions',
2504
- description: 'Get all discussion threads on a document (wiki page, work item, issue, etc.). ' +
2505
- 'Returns discussions with their full comment threads including replies.',
2506
- inputSchema: {
2507
- type: 'object',
2508
- properties: {
2509
- document_type: {
2510
- type: 'string',
2511
- description: 'Document type (e.g. "wiki", "work_item", "issue")',
2512
- },
2513
- document_id: {
2514
- type: 'string',
2515
- description: 'The ID of the document',
2516
- },
2517
- project_slug: {
2518
- type: 'string',
2519
- description: 'Project slug — a document ID is only unique within one project',
2520
- },
2521
- },
2522
- required: ['document_type', 'document_id'],
2523
- },
2524
- },
2525
- {
2526
- name: 'get_discussion_by_comment',
2527
- description: 'Find the full discussion thread containing a specific comment. ' +
2528
- 'Use this when you have a comment ID from a notification (sourceDocumentType: "discussion_comment") ' +
2529
- 'and need to see the full discussion context.',
2530
- inputSchema: {
2531
- type: 'object',
2532
- properties: {
2533
- comment_id: {
2534
- type: 'string',
2535
- description: 'The comment ID (e.g. from a notification sourceDocumentId)',
2536
- },
2537
- },
2538
- required: ['comment_id'],
2539
- },
2540
- },
2541
- {
2542
- name: 'create_discussion_comment',
2543
- description: 'Add a comment to a discussion thread. Supports threaded replies via parent_comment_id. ' +
2544
- 'Use this to respond to wiki page discussions, work item discussions, or any document discussion.',
2545
- inputSchema: {
2546
- type: 'object',
2547
- properties: {
2548
- discussion_id: {
2549
- type: 'string',
2550
- description: 'The ID of the discussion to comment on',
2551
- },
2552
- content: {
2553
- type: 'string',
2554
- description: 'Comment content (supports markdown and @mentions)',
2555
- },
2556
- parent_comment_id: {
2557
- type: 'string',
2558
- description: 'Parent comment ID for threaded replies (omit for top-level)',
2559
- },
2560
- },
2561
- required: ['discussion_id', 'content'],
2562
- },
2563
- },
2564
- ...(this.capabilities.includes('procedures') ? PROCEDURE_TOOLS : []),
832
+ ...stdioTools(this.capabilities),
2565
833
  ...(this.capabilities.includes('agent_self') ? AGENT_SELF_TOOLS : []),
2566
834
  ...(this.capabilities.includes('agent_memory') ? AGENT_MEMORY_TOOLS : []),
2567
835
  ...(this.capabilities.includes('agent_builder') ? AGENT_BUILDER_TOOLS : []),
@@ -3160,12 +1428,10 @@ class WolfpackMCPServer {
3160
1428
  }
3161
1429
  case 'update_wiki_page': {
3162
1430
  const parsed = UpdateWikiPageSchema.parse(args);
3163
- const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
3164
1431
  const page = await this.client.updateWikiPage(parsed.page_id, {
3165
1432
  title: parsed.title,
3166
1433
  content: parsed.content,
3167
- tagIds: parsed.tag_ids,
3168
- }, teamSlug);
1434
+ });
3169
1435
  return {
3170
1436
  content: [
3171
1437
  {
@@ -3228,7 +1494,6 @@ class WolfpackMCPServer {
3228
1494
  const entry = await this.client.updateJournalEntry(parsed.entry_id, {
3229
1495
  title: parsed.title,
3230
1496
  content: parsed.content,
3231
- tagIds: parsed.tag_ids,
3232
1497
  }, teamSlug);
3233
1498
  return {
3234
1499
  content: [
@@ -3661,7 +1926,7 @@ class WolfpackMCPServer {
3661
1926
  }
3662
1927
  // Check procedure tools
3663
1928
  if (this.capabilities.includes('procedures')) {
3664
- const procedureToolNames = PROCEDURE_TOOLS.map((t) => t.name);
1929
+ const procedureToolNames = toolNamesFor('procedures');
3665
1930
  if (procedureToolNames.includes(name)) {
3666
1931
  return handleProcedureTool(name, args, this.client);
3667
1932
  }