@agllama/mcp 0.5.24 → 0.5.26

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.
@@ -1,256 +1,261 @@
1
1
  import { z } from 'zod';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
2
4
  import { getApiClient, LlamaApiError } from '../api-client.js';
3
5
  import { getSessionDefaults } from './session.js';
4
- function formatFileSize(bytes) {
5
- if (bytes < 1024)
6
- return `${bytes} B`;
7
- if (bytes < 1024 * 1024)
8
- return `${(bytes / 1024).toFixed(1)} KB`;
9
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
6
+ async function resolveOrgProject(inputOrgSlug, inputProjectKey) {
7
+ const defaults = await getSessionDefaults();
8
+ const orgSlug = inputOrgSlug ?? defaults?.orgSlug;
9
+ const projectKey = inputProjectKey ?? defaults?.projectKey;
10
+ if (!orgSlug) {
11
+ return { error: 'orgSlug is required. Either provide it or set session context with llama_set_context first.' };
12
+ }
13
+ if (!projectKey) {
14
+ return { error: 'projectKey is required. Either provide it or set session context with llama_set_context first.' };
15
+ }
16
+ return { orgSlug, projectKey };
10
17
  }
11
- const BASE64_REGEX = /^[A-Za-z0-9+/]*={0,2}$/;
12
- function isValidBase64(str) {
13
- return str.length > 0 && str.length % 4 === 0 && BASE64_REGEX.test(str);
18
+ function formatError(error, operation) {
19
+ if (error instanceof LlamaApiError) {
20
+ return JSON.stringify({
21
+ success: false,
22
+ error: `Failed to ${operation}: ${error.message}`,
23
+ statusCode: error.statusCode,
24
+ });
25
+ }
26
+ return JSON.stringify({
27
+ success: false,
28
+ error: error instanceof Error ? error.message : 'Unknown error',
29
+ });
14
30
  }
31
+ const MIME_MAP = {
32
+ '.jpg': 'image/jpeg',
33
+ '.jpeg': 'image/jpeg',
34
+ '.png': 'image/png',
35
+ '.gif': 'image/gif',
36
+ '.webp': 'image/webp',
37
+ '.pdf': 'application/pdf',
38
+ '.doc': 'application/msword',
39
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
40
+ '.xls': 'application/vnd.ms-excel',
41
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
42
+ '.txt': 'text/plain',
43
+ '.md': 'text/markdown',
44
+ '.csv': 'text/csv',
45
+ '.json': 'application/json',
46
+ '.zip': 'application/zip',
47
+ };
48
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
15
49
  // ============================================
16
- // List Attachments
50
+ // Attach File
17
51
  // ============================================
18
- export const listAttachmentsToolName = 'llama_list_attachments';
19
- export const listAttachmentsToolDescription = `List all file attachments for an issue.
20
- Returns attachment details including file name, size, type, and uploader.`;
21
- export const listAttachmentsToolSchema = z.object({
22
- orgSlug: z
23
- .string()
24
- .optional()
25
- .describe('Organization slug (uses session default if not provided)'),
26
- projectKey: z
27
- .string()
28
- .optional()
29
- .describe('Project key (uses session default if not provided)'),
52
+ export const attachFileToolName = 'llama_attach_file';
53
+ export const attachFileToolDescription = `Upload files from local disk to an issue as attachments. Accepts absolute file paths. Max 10MB per file. Supported types: images (png, jpg, gif, webp), documents (pdf, doc, docx, xls, xlsx, txt, md, csv, json), archives (zip). Use embedInDescription to automatically append image markdown to the issue description.`;
54
+ export const attachFileToolSchema = z.object({
55
+ orgSlug: z.string().optional().describe('Organization slug (uses session default if not provided)'),
56
+ projectKey: z.string().optional().describe('Project key (uses session default if not provided)'),
30
57
  issueKey: z.string().describe('Issue key (e.g., "PROJ-123")'),
58
+ filePaths: z.array(z.string()).min(1).describe('Absolute file paths to upload'),
59
+ embedInDescription: z.boolean().optional().describe('If true, appends markdown image/link references to the issue description for uploaded files'),
31
60
  });
32
- export async function executeListAttachments(input) {
61
+ export async function executeAttachFile(input) {
33
62
  try {
34
- const session = await getSessionDefaults();
35
- const orgSlug = input.orgSlug ?? session?.orgSlug;
36
- const projectKey = input.projectKey ?? session?.projectKey;
37
- if (!orgSlug) {
38
- return JSON.stringify({
39
- success: false,
40
- error: 'orgSlug is required. Either provide it or set session context with llama_set_context first.',
41
- });
42
- }
43
- if (!projectKey) {
44
- return JSON.stringify({
45
- success: false,
46
- error: 'projectKey is required. Either provide it or set session context with llama_set_context first.',
47
- });
63
+ const context = await resolveOrgProject(input.orgSlug, input.projectKey);
64
+ if ('error' in context) {
65
+ return JSON.stringify({ success: false, error: context.error });
48
66
  }
49
67
  const client = getApiClient();
50
- // Record tool call
51
68
  try {
52
- await client.recordToolCall('llama_list_attachments', { orgSlug, projectKey, issueKey: input.issueKey });
69
+ await client.recordToolCall('llama_attach_file', { orgSlug: context.orgSlug, projectKey: context.projectKey });
53
70
  }
54
71
  catch {
55
72
  // Ignore recording errors
56
73
  }
57
- const attachments = await client.listAttachments(orgSlug, projectKey, input.issueKey);
58
- if (attachments.length === 0) {
59
- return JSON.stringify({
60
- success: true,
61
- issueKey: input.issueKey,
62
- message: 'No attachments found',
63
- attachments: [],
64
- count: 0,
65
- }, null, 2);
74
+ // Validate all files before uploading any
75
+ const validatedFiles = [];
76
+ for (const filePath of input.filePaths) {
77
+ // Security: require absolute paths, reject traversal
78
+ if (!path.isAbsolute(filePath)) {
79
+ return JSON.stringify({ success: false, error: `Path must be absolute: ${filePath}` });
80
+ }
81
+ if (filePath.includes('..')) {
82
+ return JSON.stringify({ success: false, error: `Path traversal not allowed: ${filePath}` });
83
+ }
84
+ // Check file exists and get size
85
+ let stat;
86
+ try {
87
+ stat = await fs.stat(filePath);
88
+ }
89
+ catch {
90
+ return JSON.stringify({ success: false, error: `File not found: ${filePath}` });
91
+ }
92
+ if (!stat.isFile()) {
93
+ return JSON.stringify({ success: false, error: `Not a file: ${filePath}` });
94
+ }
95
+ if (stat.size > MAX_FILE_SIZE) {
96
+ return JSON.stringify({
97
+ success: false,
98
+ error: `File too large (${(stat.size / 1024 / 1024).toFixed(1)}MB > 10MB limit): ${filePath}`,
99
+ });
100
+ }
101
+ // Check MIME type
102
+ const ext = path.extname(filePath).toLowerCase();
103
+ const mimeType = MIME_MAP[ext];
104
+ if (!mimeType) {
105
+ return JSON.stringify({
106
+ success: false,
107
+ error: `Unsupported file type "${ext}". Supported: ${Object.keys(MIME_MAP).join(', ')}`,
108
+ });
109
+ }
110
+ validatedFiles.push({
111
+ filePath,
112
+ fileName: path.basename(filePath),
113
+ mimeType,
114
+ size: stat.size,
115
+ });
66
116
  }
67
- return JSON.stringify({
68
- success: true,
69
- issueKey: input.issueKey,
70
- attachments: attachments.map((a) => ({
71
- id: a.id,
72
- fileName: a.originalName,
73
- fileSize: formatFileSize(a.fileSize),
74
- fileSizeBytes: a.fileSize,
75
- mimeType: a.mimeType,
76
- uploadedBy: a.uploadedBy.name,
77
- uploadedAt: a.createdAt,
78
- })),
79
- count: attachments.length,
80
- }, null, 2);
81
- }
82
- catch (error) {
83
- if (error instanceof LlamaApiError) {
117
+ // Upload each file
118
+ const results = [];
119
+ const errors = [];
120
+ for (const file of validatedFiles) {
121
+ try {
122
+ const buffer = await fs.readFile(file.filePath);
123
+ const attachment = await client.uploadAttachmentBuffer(context.orgSlug, context.projectKey, input.issueKey, file.fileName, buffer, file.mimeType);
124
+ const downloadUrl = client.getAttachmentDownloadUrl(context.orgSlug, context.projectKey, input.issueKey, attachment.id);
125
+ results.push({
126
+ fileName: file.fileName,
127
+ size: file.size,
128
+ attachmentId: attachment.id,
129
+ downloadUrl,
130
+ mimeType: file.mimeType,
131
+ });
132
+ }
133
+ catch (err) {
134
+ errors.push({
135
+ fileName: file.fileName,
136
+ error: err instanceof Error ? err.message : 'Upload failed',
137
+ });
138
+ }
139
+ }
140
+ if (errors.length > 0 && results.length === 0) {
84
141
  return JSON.stringify({
85
142
  success: false,
86
- error: `Failed to list attachments: ${error.message}`,
87
- statusCode: error.statusCode,
143
+ error: 'All uploads failed',
144
+ errors,
88
145
  });
89
146
  }
147
+ // Embed in description if requested
148
+ if (input.embedInDescription && results.length > 0) {
149
+ try {
150
+ const issue = await client.getIssue(context.orgSlug, context.projectKey, input.issueKey);
151
+ const existingDesc = issue.description || '';
152
+ const markdownLines = results.map((r) => {
153
+ if (r.mimeType.startsWith('image/')) {
154
+ return `![${r.fileName}](${r.downloadUrl})`;
155
+ }
156
+ return `[${r.fileName}](${r.downloadUrl})`;
157
+ });
158
+ const separator = existingDesc.length > 0 ? '\n\n' : '';
159
+ const newDescription = existingDesc + separator + markdownLines.join('\n\n');
160
+ await client.updateIssue(context.orgSlug, context.projectKey, input.issueKey, {
161
+ description: newDescription,
162
+ });
163
+ }
164
+ catch {
165
+ // Don't fail the whole operation if embed fails
166
+ return JSON.stringify({
167
+ success: true,
168
+ message: `Uploaded ${results.length} file(s) to ${input.issueKey} (but failed to embed in description)`,
169
+ attachments: results,
170
+ ...(errors.length > 0 ? { errors } : {}),
171
+ });
172
+ }
173
+ }
90
174
  return JSON.stringify({
91
- success: false,
92
- error: error instanceof Error ? error.message : 'Unknown error',
175
+ success: true,
176
+ message: `Uploaded ${results.length} file(s) to ${input.issueKey}${input.embedInDescription ? ' and embedded in description' : ''}`,
177
+ attachments: results,
178
+ ...(errors.length > 0 ? { errors } : {}),
93
179
  });
94
180
  }
181
+ catch (error) {
182
+ return formatError(error, 'attach file');
183
+ }
95
184
  }
96
185
  // ============================================
97
- // Upload Attachment
186
+ // List Attachments
98
187
  // ============================================
99
- export const uploadAttachmentToolName = 'llama_upload_attachment';
100
- export const uploadAttachmentToolDescription = `Upload a file attachment to an issue using base64-encoded content.
101
- The file will be attached to the issue and visible to all project members.
102
-
103
- Example:
104
- {
105
- "issueKey": "PROJ-123",
106
- "fileName": "screenshot.png",
107
- "base64Content": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
108
- "mimeType": "image/png"
109
- }`;
110
- export const uploadAttachmentToolSchema = z.object({
111
- orgSlug: z
112
- .string()
113
- .optional()
114
- .describe('Organization slug (uses session default if not provided)'),
115
- projectKey: z
116
- .string()
117
- .optional()
118
- .describe('Project key (uses session default if not provided)'),
188
+ export const listAttachmentsToolName = 'llama_list_attachments';
189
+ export const listAttachmentsToolDescription = `List all attachments on an issue.`;
190
+ export const listAttachmentsToolSchema = z.object({
191
+ orgSlug: z.string().optional().describe('Organization slug (uses session default if not provided)'),
192
+ projectKey: z.string().optional().describe('Project key (uses session default if not provided)'),
119
193
  issueKey: z.string().describe('Issue key (e.g., "PROJ-123")'),
120
- fileName: z.string().describe('Original file name with extension'),
121
- base64Content: z.string().describe('Base64-encoded file content'),
122
- mimeType: z.string().describe('MIME type (e.g., "image/png", "application/pdf")'),
123
194
  });
124
- export async function executeUploadAttachment(input) {
195
+ export async function executeListAttachments(input) {
125
196
  try {
126
- const session = await getSessionDefaults();
127
- const orgSlug = input.orgSlug ?? session?.orgSlug;
128
- const projectKey = input.projectKey ?? session?.projectKey;
129
- if (!orgSlug) {
130
- return JSON.stringify({
131
- success: false,
132
- error: 'orgSlug is required. Either provide it or set session context with llama_set_context first.',
133
- });
134
- }
135
- if (!projectKey) {
136
- return JSON.stringify({
137
- success: false,
138
- error: 'projectKey is required. Either provide it or set session context with llama_set_context first.',
139
- });
140
- }
141
- if (!isValidBase64(input.base64Content)) {
142
- return JSON.stringify({
143
- success: false,
144
- error: 'Invalid base64Content. The string must be valid base64-encoded data (length must be a multiple of 4, using only A-Z, a-z, 0-9, +, /, and = padding).',
145
- });
197
+ const context = await resolveOrgProject(input.orgSlug, input.projectKey);
198
+ if ('error' in context) {
199
+ return JSON.stringify({ success: false, error: context.error });
146
200
  }
147
201
  const client = getApiClient();
148
- // Record tool call
149
202
  try {
150
- await client.recordToolCall('llama_upload_attachment', {
151
- orgSlug,
152
- projectKey,
153
- issueKey: input.issueKey,
154
- fileName: input.fileName,
155
- });
203
+ await client.recordToolCall('llama_list_attachments', { orgSlug: context.orgSlug, projectKey: context.projectKey });
156
204
  }
157
205
  catch {
158
206
  // Ignore recording errors
159
207
  }
160
- const attachment = await client.uploadAttachment(orgSlug, projectKey, input.issueKey, input.fileName, input.base64Content, input.mimeType);
208
+ const attachments = await client.listAttachments(context.orgSlug, context.projectKey, input.issueKey);
161
209
  return JSON.stringify({
162
210
  success: true,
163
- message: `Uploaded ${input.fileName} to ${input.issueKey}`,
164
- attachment: {
165
- id: attachment.id,
166
- fileName: attachment.originalName,
167
- fileSize: formatFileSize(attachment.fileSize),
168
- mimeType: attachment.mimeType,
169
- uploadedBy: attachment.uploadedBy.name,
170
- uploadedAt: attachment.createdAt,
171
- },
211
+ issueKey: input.issueKey,
212
+ count: attachments.length,
213
+ attachments: attachments.map((a) => ({
214
+ id: a.id,
215
+ fileName: a.originalName,
216
+ fileSize: a.fileSize,
217
+ mimeType: a.mimeType,
218
+ uploadedBy: a.uploadedBy.name,
219
+ createdAt: a.createdAt,
220
+ })),
172
221
  });
173
222
  }
174
223
  catch (error) {
175
- if (error instanceof LlamaApiError) {
176
- return JSON.stringify({
177
- success: false,
178
- error: `Failed to upload attachment: ${error.message}`,
179
- statusCode: error.statusCode,
180
- });
181
- }
182
- return JSON.stringify({
183
- success: false,
184
- error: error instanceof Error ? error.message : 'Unknown error',
185
- });
224
+ return formatError(error, 'list attachments');
186
225
  }
187
226
  }
188
227
  // ============================================
189
228
  // Delete Attachment
190
229
  // ============================================
191
230
  export const deleteAttachmentToolName = 'llama_delete_attachment';
192
- export const deleteAttachmentToolDescription = `Delete a file attachment from an issue.
193
- Requires the attachment ID which can be obtained from llama_list_attachments.`;
231
+ export const deleteAttachmentToolDescription = `Delete an attachment from an issue.`;
194
232
  export const deleteAttachmentToolSchema = z.object({
195
- orgSlug: z
196
- .string()
197
- .optional()
198
- .describe('Organization slug (uses session default if not provided)'),
199
- projectKey: z
200
- .string()
201
- .optional()
202
- .describe('Project key (uses session default if not provided)'),
233
+ orgSlug: z.string().optional().describe('Organization slug (uses session default if not provided)'),
234
+ projectKey: z.string().optional().describe('Project key (uses session default if not provided)'),
203
235
  issueKey: z.string().describe('Issue key (e.g., "PROJ-123")'),
204
- attachmentId: z.string().describe('Attachment ID (UUID)'),
236
+ attachmentId: z.string().describe('Attachment ID to delete'),
205
237
  });
206
238
  export async function executeDeleteAttachment(input) {
207
239
  try {
208
- const session = await getSessionDefaults();
209
- const orgSlug = input.orgSlug ?? session?.orgSlug;
210
- const projectKey = input.projectKey ?? session?.projectKey;
211
- if (!orgSlug) {
212
- return JSON.stringify({
213
- success: false,
214
- error: 'orgSlug is required. Either provide it or set session context with llama_set_context first.',
215
- });
216
- }
217
- if (!projectKey) {
218
- return JSON.stringify({
219
- success: false,
220
- error: 'projectKey is required. Either provide it or set session context with llama_set_context first.',
221
- });
240
+ const context = await resolveOrgProject(input.orgSlug, input.projectKey);
241
+ if ('error' in context) {
242
+ return JSON.stringify({ success: false, error: context.error });
222
243
  }
223
244
  const client = getApiClient();
224
- // Record tool call
225
245
  try {
226
- await client.recordToolCall('llama_delete_attachment', {
227
- orgSlug,
228
- projectKey,
229
- issueKey: input.issueKey,
230
- attachmentId: input.attachmentId
231
- });
246
+ await client.recordToolCall('llama_delete_attachment', { orgSlug: context.orgSlug, projectKey: context.projectKey });
232
247
  }
233
248
  catch {
234
249
  // Ignore recording errors
235
250
  }
236
- await client.deleteAttachment(orgSlug, projectKey, input.issueKey, input.attachmentId);
251
+ await client.deleteAttachment(context.orgSlug, context.projectKey, input.issueKey, input.attachmentId);
237
252
  return JSON.stringify({
238
253
  success: true,
239
- message: `Deleted attachment from ${input.issueKey}`,
254
+ message: `Deleted attachment ${input.attachmentId} from ${input.issueKey}`,
240
255
  });
241
256
  }
242
257
  catch (error) {
243
- if (error instanceof LlamaApiError) {
244
- return JSON.stringify({
245
- success: false,
246
- error: `Failed to delete attachment: ${error.message}`,
247
- statusCode: error.statusCode,
248
- });
249
- }
250
- return JSON.stringify({
251
- success: false,
252
- error: error instanceof Error ? error.message : 'Unknown error',
253
- });
258
+ return formatError(error, 'delete attachment');
254
259
  }
255
260
  }
256
261
  //# sourceMappingURL=attachments.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ export * from './projectErrors.js';
23
23
  export * from './help.js';
24
24
  export * from './session.js';
25
25
  export * from './userDocs.js';
26
+ export * from './attachments.js';
26
27
  export * from './notificationRules.js';
27
28
  export * from './refinement.js';
28
29
  export * from './analytics.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AAEpC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAElC,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAG9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AAEpC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAElC,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
@@ -25,7 +25,7 @@ export * from './projectErrors.js';
25
25
  export * from './help.js';
26
26
  export * from './session.js';
27
27
  export * from './userDocs.js';
28
- // attachments.ts removed - use UI for file uploads
28
+ export * from './attachments.js';
29
29
  // integrations.ts removed - use web UI for Slack setup
30
30
  export * from './notificationRules.js';
31
31
  export * from './refinement.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,yDAAyD;AACzD,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,yFAAyF;AACzF,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,mDAAmD;AACnD,uDAAuD;AACvD,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,yDAAyD;AACzD,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,yFAAyF;AACzF,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,uDAAuD;AACvD,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
package/dist/types.d.ts CHANGED
@@ -278,6 +278,7 @@ export interface MCPBoardIssue {
278
278
  export interface MCPBoard {
279
279
  id: string;
280
280
  name: string;
281
+ boardRole?: 'BUSINESS' | 'TECHNICAL' | null;
281
282
  columns: MCPBoardColumn[];
282
283
  issues?: MCPBoardIssue[];
283
284
  }
@@ -650,6 +651,8 @@ export interface MCPAttachment {
650
651
  storedName: string;
651
652
  mimeType: string;
652
653
  fileSize: number;
654
+ storageType: string;
655
+ storageKey: string | null;
653
656
  createdAt: string;
654
657
  uploadedBy: {
655
658
  id: string;