@freelancercom/phabricator-mcp 2.0.13 → 2.0.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.
@@ -32,7 +32,7 @@ export function registerDiffusionTools(server, client) {
32
32
  });
33
33
  // Search commits
34
34
  server.tool('phabricator_commit_search', 'Search Diffusion commits', {
35
- queryKey: z.string().optional().describe('Built-in query: "all", "authored"'),
35
+ queryKey: z.string().optional().describe('Built-in query: "all", "active", "authored", "audited"'),
36
36
  constraints: jsonCoerce(z.object({
37
37
  ids: z.array(z.coerce.number()).optional().describe('Commit IDs'),
38
38
  phids: z.array(z.string()).optional().describe('Commit PHIDs'),
@@ -22,7 +22,7 @@ export function registerHarbormasterTools(server, client) {
22
22
  });
23
23
  // Search builds
24
24
  server.tool('phabricator_build_search', 'Search Harbormaster builds (CI/build results)', {
25
- queryKey: z.string().optional().describe('Built-in query: "all"'),
25
+ queryKey: z.string().optional().describe('Built-in query: "all", "initiated", "waiting", "active", "completed"'),
26
26
  constraints: jsonCoerce(z.object({
27
27
  ids: z.array(z.coerce.number()).optional().describe('Build IDs'),
28
28
  phids: z.array(z.string()).optional().describe('Build PHIDs'),
@@ -93,13 +93,14 @@ export function registerHarbormasterTools(server, client) {
93
93
  duration: z.coerce.number().optional().describe('Duration in seconds'),
94
94
  path: z.string().optional().describe('File path related to the test'),
95
95
  coverage: z.record(z.string(), z.string()).optional().describe('Coverage data as {path: "NNCUUUC..."} where N=not executable, C=covered, U=uncovered'),
96
+ format: z.string().optional().describe('Format for details field: "text" (default) or "remarkup"'),
96
97
  details: z.string().optional().describe('Additional details or failure message'),
97
98
  }))).optional().describe('Unit test results to report'),
98
99
  lint: jsonCoerce(z.array(z.object({
99
100
  name: z.string().describe('Lint message name'),
100
101
  code: z.string().describe('Lint rule code'),
101
102
  severity: z.string().describe('Severity: "advice", "autofix", "warning", "error", "disabled"'),
102
- path: z.string().optional().describe('File path'),
103
+ path: z.string().describe('File path'),
103
104
  line: z.coerce.number().optional().describe('Line number'),
104
105
  char: z.coerce.number().optional().describe('Character offset'),
105
106
  description: z.string().optional().describe('Lint message description'),
@@ -3,7 +3,7 @@ import { jsonCoerce } from './coerce.js';
3
3
  export function registerManiphestTools(server, client) {
4
4
  // Search tasks
5
5
  server.tool('phabricator_task_search', 'Search Maniphest tasks with optional filters', {
6
- queryKey: z.string().optional().describe('Built-in query: "all", "open", "authored", "assigned"'),
6
+ queryKey: z.string().optional().describe('Built-in query: "all", "open", "authored", "assigned", "subscribed"'),
7
7
  constraints: jsonCoerce(z.object({
8
8
  ids: z.array(z.coerce.number()).optional().describe('Task IDs to search for'),
9
9
  phids: z.array(z.string()).optional().describe('Task PHIDs to search for'),
@@ -34,7 +34,7 @@ export function registerManiphestTools(server, client) {
34
34
  projects: z.boolean().optional().describe('Include project info'),
35
35
  subscribers: z.boolean().optional().describe('Include subscriber info'),
36
36
  })).optional().describe('Data attachments to include'),
37
- order: z.string().optional().describe('Result order: "priority", "updated", "newest", "oldest", "title", "relevance"'),
37
+ order: z.string().optional().describe('Result order: "priority", "updated", "outdated", "newest", "oldest", "closed", "title", "relevance"'),
38
38
  limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
39
39
  after: z.string().optional().describe('Cursor for next-page pagination'),
40
40
  before: z.string().optional().describe('Cursor for previous-page pagination'),
@@ -51,9 +51,9 @@ export function registerManiphestTools(server, client) {
51
51
  projectPHIDs: z.array(z.string()).optional().describe('Project PHIDs to tag'),
52
52
  subscriberPHIDs: z.array(z.string()).optional().describe('Subscriber PHIDs'),
53
53
  status: z.string().optional().describe('Initial status'),
54
- subtype: z.string().optional().describe('Task subtype (e.g. "default", "incident")'),
55
54
  parentPHIDs: z.array(z.string()).optional().describe('Parent task PHIDs'),
56
55
  subtaskPHIDs: z.array(z.string()).optional().describe('Subtask PHIDs'),
56
+ commitPHIDs: z.array(z.string()).optional().describe('Commit PHIDs to associate'),
57
57
  points: z.coerce.number().nullable().optional().describe('Story points value (if points are enabled on this instance)'),
58
58
  space: z.string().optional().describe('Space PHID to place the task in (for multi-space installations)'),
59
59
  comment: z.string().optional().describe('Initial comment on the task (supports Remarkup)'),
@@ -80,15 +80,15 @@ export function registerManiphestTools(server, client) {
80
80
  if (params.status !== undefined) {
81
81
  transactions.push({ type: 'status', value: params.status });
82
82
  }
83
- if (params.subtype !== undefined) {
84
- transactions.push({ type: 'subtype', value: params.subtype });
85
- }
86
83
  if (params.parentPHIDs !== undefined) {
87
84
  transactions.push({ type: 'parents.set', value: params.parentPHIDs });
88
85
  }
89
86
  if (params.subtaskPHIDs !== undefined) {
90
87
  transactions.push({ type: 'subtasks.set', value: params.subtaskPHIDs });
91
88
  }
89
+ if (params.commitPHIDs !== undefined) {
90
+ transactions.push({ type: 'commits.set', value: params.commitPHIDs });
91
+ }
92
92
  if (params.points !== undefined) {
93
93
  transactions.push({ type: 'points', value: params.points });
94
94
  }
@@ -114,7 +114,6 @@ export function registerManiphestTools(server, client) {
114
114
  ownerPHID: z.string().nullable().optional().describe('New owner PHID (null to unassign)'),
115
115
  priority: z.string().optional().describe('New priority'),
116
116
  status: z.string().optional().describe('New status: open, resolved, wontfix, invalid, spite, duplicate'),
117
- subtype: z.string().optional().describe('Task subtype (e.g. "default", "incident")'),
118
117
  addProjectPHIDs: z.array(z.string()).optional().describe('Project PHIDs to add'),
119
118
  removeProjectPHIDs: z.array(z.string()).optional().describe('Project PHIDs to remove'),
120
119
  addSubscriberPHIDs: z.array(z.string()).optional().describe('Subscriber PHIDs to add'),
@@ -123,6 +122,8 @@ export function registerManiphestTools(server, client) {
123
122
  removeParentPHIDs: z.array(z.string()).optional().describe('Parent task PHIDs to remove'),
124
123
  addSubtaskPHIDs: z.array(z.string()).optional().describe('Subtask PHIDs to add'),
125
124
  removeSubtaskPHIDs: z.array(z.string()).optional().describe('Subtask PHIDs to remove'),
125
+ addCommitPHIDs: z.array(z.string()).optional().describe('Commit PHIDs to associate'),
126
+ removeCommitPHIDs: z.array(z.string()).optional().describe('Commit PHIDs to disassociate'),
126
127
  points: z.coerce.number().nullable().optional().describe('Story points value (null to clear)'),
127
128
  columnPHID: z.string().optional().describe('Move to workboard column'),
128
129
  space: z.string().optional().describe('Space PHID to move the task to (for multi-space installations)'),
@@ -145,9 +146,6 @@ export function registerManiphestTools(server, client) {
145
146
  if (params.status !== undefined) {
146
147
  transactions.push({ type: 'status', value: params.status });
147
148
  }
148
- if (params.subtype !== undefined) {
149
- transactions.push({ type: 'subtype', value: params.subtype });
150
- }
151
149
  if (params.addProjectPHIDs !== undefined) {
152
150
  transactions.push({ type: 'projects.add', value: params.addProjectPHIDs });
153
151
  }
@@ -172,6 +170,12 @@ export function registerManiphestTools(server, client) {
172
170
  if (params.removeSubtaskPHIDs !== undefined) {
173
171
  transactions.push({ type: 'subtasks.remove', value: params.removeSubtaskPHIDs });
174
172
  }
173
+ if (params.addCommitPHIDs !== undefined) {
174
+ transactions.push({ type: 'commits.add', value: params.addCommitPHIDs });
175
+ }
176
+ if (params.removeCommitPHIDs !== undefined) {
177
+ transactions.push({ type: 'commits.remove', value: params.removeCommitPHIDs });
178
+ }
175
179
  if (params.points !== undefined) {
176
180
  transactions.push({ type: 'points', value: params.points });
177
181
  }
@@ -3,7 +3,7 @@ import { jsonCoerce } from './coerce.js';
3
3
  export function registerOwnersTools(server, client) {
4
4
  // Search code ownership packages
5
5
  server.tool('phabricator_owners_search', 'Search Owners packages (code ownership). Find who owns a code path or list ownership packages.', {
6
- queryKey: z.string().optional().describe('Built-in query: "all", "active"'),
6
+ queryKey: z.string().optional().describe('Built-in query: "all", "active", "authority"'),
7
7
  constraints: jsonCoerce(z.object({
8
8
  ids: z.array(z.coerce.number()).optional().describe('Package IDs'),
9
9
  phids: z.array(z.string()).optional().describe('Package PHIDs'),
@@ -3,7 +3,7 @@ import { jsonCoerce } from './coerce.js';
3
3
  export function registerPasteTools(server, client) {
4
4
  // Search pastes
5
5
  server.tool('phabricator_paste_search', 'Search Phabricator pastes', {
6
- queryKey: z.string().optional().describe('Built-in query: "all", "authored"'),
6
+ queryKey: z.string().optional().describe('Built-in query: "all", "active", "authored"'),
7
7
  constraints: jsonCoerce(z.object({
8
8
  ids: z.array(z.coerce.number()).optional().describe('Paste IDs'),
9
9
  phids: z.array(z.string()).optional().describe('Paste PHIDs'),
@@ -3,10 +3,11 @@ import { jsonCoerce } from './coerce.js';
3
3
  export function registerPhameTools(server, client) {
4
4
  // Search blogs
5
5
  server.tool('phabricator_blog_search', 'Search Phame blogs', {
6
- queryKey: z.string().optional().describe('Built-in query: "all", "active"'),
6
+ queryKey: z.string().optional().describe('Built-in query: "all", "active", "archived"'),
7
7
  constraints: jsonCoerce(z.object({
8
8
  ids: z.array(z.coerce.number()).optional().describe('Blog IDs'),
9
9
  phids: z.array(z.string()).optional().describe('Blog PHIDs'),
10
+ statuses: z.string().optional().describe('Blog status: "active" or "archived"'),
10
11
  subscribers: z.array(z.string()).optional().describe('Subscriber user/project PHIDs'),
11
12
  projects: z.array(z.string()).optional().describe('Project PHIDs'),
12
13
  query: z.string().optional().describe('Full-text search query'),
@@ -80,12 +81,12 @@ export function registerPhameTools(server, client) {
80
81
  });
81
82
  // Search blog posts
82
83
  server.tool('phabricator_blog_post_search', 'Search Phame blog posts', {
83
- queryKey: z.string().optional().describe('Built-in query: "all", "live"'),
84
+ queryKey: z.string().optional().describe('Built-in query: "all", "live", "draft", "archived"'),
84
85
  constraints: jsonCoerce(z.object({
85
86
  ids: z.array(z.coerce.number()).optional().describe('Post IDs'),
86
87
  phids: z.array(z.string()).optional().describe('Post PHIDs'),
87
88
  blogPHIDs: z.array(z.string()).optional().describe('Filter by blog PHIDs'),
88
- visibility: z.array(z.coerce.number()).optional().describe('Visibility values: 0 (draft), 1 (published), 2 (archived)'),
89
+ visibility: z.array(z.string()).optional().describe('Visibility values: "0" (draft), "1" (published), "2" (archived)'),
89
90
  subscribers: z.array(z.string()).optional().describe('Subscriber user/project PHIDs'),
90
91
  projects: z.array(z.string()).optional().describe('Project PHIDs'),
91
92
  query: z.string().optional().describe('Full-text search query'),
@@ -3,7 +3,7 @@ import { jsonCoerce } from './coerce.js';
3
3
  export function registerProjectTools(server, client) {
4
4
  // Search projects
5
5
  server.tool('phabricator_project_search', 'Search Phabricator projects', {
6
- queryKey: z.string().optional().describe('Built-in query: "all", "active", "joined"'),
6
+ queryKey: z.string().optional().describe('Built-in query: "all", "active", "joined", "watching"'),
7
7
  constraints: jsonCoerce(z.object({
8
8
  ids: z.array(z.coerce.number()).optional().describe('Project IDs'),
9
9
  phids: z.array(z.string()).optional().describe('Project PHIDs'),
@@ -2,7 +2,8 @@ import { z } from 'zod';
2
2
  import { jsonCoerce } from './coerce.js';
3
3
  export function registerTransactionTools(server, client) {
4
4
  server.tool('phabricator_transaction_search', 'Search transactions (comments, status changes, etc.) on any Phabricator object (e.g., "D123", "T456")', {
5
- objectIdentifier: z.string().describe('Object ID (e.g., "D123", "T456") or PHID'),
5
+ objectIdentifier: z.string().optional().describe('Object ID (e.g., "D123", "T456") or PHID. Provide this or objectType, not both.'),
6
+ objectType: z.string().optional().describe('Object type group to query (e.g., "TASK", "DREV", "CMIT"). Queries all transactions of that type. Provide this or objectIdentifier, not both.'),
6
7
  constraints: jsonCoerce(z.object({
7
8
  phids: z.array(z.string()).optional().describe('Transaction PHIDs'),
8
9
  authorPHIDs: z.array(z.string()).optional().describe('Author PHIDs'),
@@ -11,9 +12,10 @@ export function registerTransactionTools(server, client) {
11
12
  after: z.string().optional().describe('Cursor for next-page pagination'),
12
13
  before: z.string().optional().describe('Cursor for previous-page pagination'),
13
14
  }, async (params) => {
14
- const { objectIdentifier, ...searchParams } = params;
15
+ const { objectIdentifier, objectType, ...searchParams } = params;
15
16
  const result = await client.call('transaction.search', {
16
17
  objectIdentifier,
18
+ objectType,
17
19
  ...searchParams,
18
20
  });
19
21
  return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
@@ -19,6 +19,7 @@ export function registerUserTools(server, client) {
19
19
  isBot: z.boolean().optional().describe('Filter by bot status'),
20
20
  isMailingList: z.boolean().optional().describe('Filter by mailing list status'),
21
21
  needsApproval: z.boolean().optional().describe('Filter to users awaiting admin approval'),
22
+ mfa: z.boolean().optional().describe('Filter by MFA enrollment status (admin-only)'),
22
23
  createdStart: z.coerce.number().optional().describe('Created after (epoch timestamp)'),
23
24
  createdEnd: z.coerce.number().optional().describe('Created before (epoch timestamp)'),
24
25
  query: z.string().optional().describe('Full-text search query'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freelancercom/phabricator-mcp",
3
- "version": "2.0.13",
3
+ "version": "2.0.15",
4
4
  "description": "MCP server for Phabricator Conduit API - manage tasks, code reviews, repositories, and more",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",