@pschroee/redmine-mcp 0.5.13 → 0.5.15

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.
@@ -157,8 +157,14 @@ export function formatIssueList(response) {
157
157
  }
158
158
  const customFieldIds = Array.from(customFieldMap.keys()).sort((a, b) => a - b);
159
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);
160
162
  // Table header
161
- const headerCols = ["ID", "Subject", "Status", "Priority", "Assigned", "Version", "Created", "Updated", ...customFieldNames];
163
+ const headerCols = ["ID", "Subject", "Status", "Priority", "Assigned", "Version", "Created", "Updated"];
164
+ if (hasTags) {
165
+ headerCols.push("Tags");
166
+ }
167
+ headerCols.push(...customFieldNames);
162
168
  lines.push("| " + headerCols.join(" | ") + " |");
163
169
  lines.push("|" + headerCols.map(() => "---").join("|") + "|");
164
170
  // Table rows
@@ -171,6 +177,7 @@ export function formatIssueList(response) {
171
177
  const version = issue.fixed_version?.name ?? "";
172
178
  const created = formatDateShort(issue.created_on);
173
179
  const updated = formatDateShort(issue.updated_on);
180
+ const tags = issue.tags?.map(t => t.name).join(", ") ?? "";
174
181
  // Build custom field values in order
175
182
  const cfValues = [];
176
183
  for (const cfId of customFieldIds) {
@@ -183,7 +190,11 @@ export function formatIssueList(response) {
183
190
  cfValues.push("");
184
191
  }
185
192
  }
186
- const cols = [id, subject, status, priority, assigned, version, created, updated, ...cfValues];
193
+ const cols = [id, subject, status, priority, assigned, version, created, updated];
194
+ if (hasTags) {
195
+ cols.push(tags);
196
+ }
197
+ cols.push(...cfValues);
187
198
  lines.push("| " + cols.join(" | ") + " |");
188
199
  }
189
200
  return lines.join("\n");
@@ -26,6 +26,7 @@ export declare class RedmineClient {
26
26
  limit?: number;
27
27
  offset?: number;
28
28
  query_id?: number;
29
+ tags?: string;
29
30
  }): Promise<RedmineResult<RedmineIssuesResponse>>;
30
31
  getIssue(id: number, include?: string): Promise<RedmineResult<{
31
32
  issue: RedmineIssue;
@@ -109,6 +109,8 @@ export class RedmineClient {
109
109
  query.set("offset", String(params.offset));
110
110
  if (params?.query_id)
111
111
  query.set("query_id", String(params.query_id));
112
+ if (params?.tags)
113
+ query.set("tags", params.tags);
112
114
  const queryString = query.toString();
113
115
  const path = `/issues.json${queryString ? `?${queryString}` : ""}`;
114
116
  return this.request("GET", path);
@@ -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;
@@ -21,6 +21,7 @@ export function registerCoreTools(server, client) {
21
21
  limit: z.number().optional().describe("Maximum results (default 25, max 100)"),
22
22
  offset: z.number().optional().describe("Skip first N results"),
23
23
  query_id: z.number().optional().describe("Use a saved query ID to filter issues (get IDs from list_queries). For project-specific queries, project_id is automatically fetched from the query if not provided."),
24
+ tags: z.string().optional().describe("Filter by tags (comma-separated tag names, requires redmine_tags plugin)"),
24
25
  },
25
26
  }, async (params) => {
26
27
  const result = await client.listIssues(params);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pschroee/redmine-mcp",
3
- "version": "0.5.13",
3
+ "version": "0.5.15",
4
4
  "description": "MCP server for Redmine - full API access with configurable tool groups",
5
5
  "type": "module",
6
6
  "bin": {