@pschroee/redmine-mcp 0.5.11 → 0.5.14

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.
@@ -144,9 +144,29 @@ export function formatIssueList(response) {
144
144
  lines.push("No issues found.");
145
145
  return lines.join("\n");
146
146
  }
147
+ // Collect all unique custom field names (preserving order by ID)
148
+ const customFieldMap = new Map(); // id -> name
149
+ for (const issue of issues) {
150
+ if (issue.custom_fields) {
151
+ for (const cf of issue.custom_fields) {
152
+ if (!customFieldMap.has(cf.id)) {
153
+ customFieldMap.set(cf.id, cf.name);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ const customFieldIds = Array.from(customFieldMap.keys()).sort((a, b) => a - b);
159
+ const customFieldNames = customFieldIds.map(id => customFieldMap.get(id));
160
+ // Check if any issue has tags
161
+ const hasTags = issues.some(issue => issue.tags && issue.tags.length > 0);
147
162
  // Table header
148
- lines.push("| ID | Subject | Status | Priority | Assigned | Updated |");
149
- lines.push("|---|---|---|---|---|---|");
163
+ const headerCols = ["ID", "Subject", "Status", "Priority", "Assigned", "Version", "Created", "Updated"];
164
+ if (hasTags) {
165
+ headerCols.push("Tags");
166
+ }
167
+ headerCols.push(...customFieldNames);
168
+ lines.push("| " + headerCols.join(" | ") + " |");
169
+ lines.push("|" + headerCols.map(() => "---").join("|") + "|");
150
170
  // Table rows
151
171
  for (const issue of issues) {
152
172
  const id = `#${issue.id}`;
@@ -154,8 +174,28 @@ export function formatIssueList(response) {
154
174
  const status = issue.status.name;
155
175
  const priority = issue.priority.name;
156
176
  const assigned = issue.assigned_to?.name ?? "_(unassigned)_";
177
+ const version = issue.fixed_version?.name ?? "";
178
+ const created = formatDateShort(issue.created_on);
157
179
  const updated = formatDateShort(issue.updated_on);
158
- lines.push(`| ${id} | ${subject} | ${status} | ${priority} | ${assigned} | ${updated} |`);
180
+ const tags = issue.tags?.map(t => t.name).join(", ") ?? "";
181
+ // Build custom field values in order
182
+ const cfValues = [];
183
+ for (const cfId of customFieldIds) {
184
+ const cf = issue.custom_fields?.find(f => f.id === cfId);
185
+ if (cf) {
186
+ const value = Array.isArray(cf.value) ? cf.value.join(", ") : cf.value;
187
+ cfValues.push(value || "");
188
+ }
189
+ else {
190
+ cfValues.push("");
191
+ }
192
+ }
193
+ const cols = [id, subject, status, priority, assigned, version, created, updated];
194
+ if (hasTags) {
195
+ cols.push(tags);
196
+ }
197
+ cols.push(...cfValues);
198
+ lines.push("| " + cols.join(" | ") + " |");
159
199
  }
160
200
  return lines.join("\n");
161
201
  }
@@ -237,6 +237,10 @@ export interface RedmineIssue {
237
237
  total_estimated_hours?: number;
238
238
  total_spent_hours?: number;
239
239
  custom_fields?: RedmineCustomFieldValue[];
240
+ tags?: {
241
+ id: number;
242
+ name: string;
243
+ }[];
240
244
  created_on: string;
241
245
  updated_on: string;
242
246
  closed_on?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pschroee/redmine-mcp",
3
- "version": "0.5.11",
3
+ "version": "0.5.14",
4
4
  "description": "MCP server for Redmine - full API access with configurable tool groups",
5
5
  "type": "module",
6
6
  "bin": {