@freelancercom/phabricator-mcp 2.0.5 → 2.0.7
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/README.md +2 -1
- package/dist/tools/conpherence.js +3 -6
- package/dist/tools/diffusion.js +6 -0
- package/dist/tools/feed.js +2 -2
- package/dist/tools/file.js +4 -2
- package/dist/tools/harbormaster.js +6 -10
- package/dist/tools/maniphest.js +3 -0
- package/dist/tools/owners.js +0 -1
- package/dist/tools/paste.js +2 -0
- package/dist/tools/phame.js +4 -2
- package/dist/tools/phriction.js +17 -35
- package/dist/tools/project.js +4 -3
- package/dist/tools/transaction.js +2 -1
- package/dist/tools/user.js +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -281,7 +281,8 @@ To allowlist all tools including write operations, use `"mcp__phabricator__*"` i
|
|
|
281
281
|
| Tool | Description |
|
|
282
282
|
|------|-------------|
|
|
283
283
|
| `phabricator_document_search` | Search wiki documents |
|
|
284
|
-
| `
|
|
284
|
+
| `phabricator_document_create` | Create a new wiki document |
|
|
285
|
+
| `phabricator_document_edit` | Edit a wiki document title or content |
|
|
285
286
|
| `phabricator_document_add_comment` | Add a comment to a wiki document |
|
|
286
287
|
|
|
287
288
|
### Blogs (Phame)
|
|
@@ -10,9 +10,6 @@ export function registerConpherenceTools(server, client) {
|
|
|
10
10
|
participants: z.array(z.string()).optional().describe('Participant user PHIDs'),
|
|
11
11
|
query: z.string().optional().describe('Full-text search query'),
|
|
12
12
|
})).optional().describe('Search constraints'),
|
|
13
|
-
attachments: jsonCoerce(z.object({
|
|
14
|
-
participants: z.boolean().optional().describe('Include participant details'),
|
|
15
|
-
})).optional().describe('Data attachments'),
|
|
16
13
|
order: z.string().optional().describe('Result order'),
|
|
17
14
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
18
15
|
after: z.string().optional().describe('Cursor for next-page pagination'),
|
|
@@ -22,13 +19,13 @@ export function registerConpherenceTools(server, client) {
|
|
|
22
19
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
23
20
|
});
|
|
24
21
|
// Read messages in a thread
|
|
25
|
-
server.tool('phabricator_conpherence_read', 'Read messages from a Conpherence chat room/thread (returned in reverse chronological order). Uses conpherence.
|
|
22
|
+
server.tool('phabricator_conpherence_read', 'Read messages from a Conpherence chat room/thread (returned in reverse chronological order). Uses conpherence.querytransaction (the only Conduit method that returns message content).', {
|
|
26
23
|
roomID: z.coerce.number().describe('Numeric room ID (use phabricator_conpherence_search to find it)'),
|
|
27
24
|
limit: z.coerce.number().max(100).optional().describe('Maximum messages to return'),
|
|
28
25
|
offset: z.coerce.number().optional().describe('Result offset for pagination'),
|
|
29
26
|
}, async (params) => {
|
|
30
|
-
const result = await client.call('conpherence.
|
|
31
|
-
|
|
27
|
+
const result = await client.call('conpherence.querytransaction', {
|
|
28
|
+
roomID: params.roomID,
|
|
32
29
|
limit: params.limit,
|
|
33
30
|
offset: params.offset,
|
|
34
31
|
});
|
package/dist/tools/diffusion.js
CHANGED
|
@@ -11,6 +11,8 @@ export function registerDiffusionTools(server, client) {
|
|
|
11
11
|
shortNames: z.array(z.string()).optional().describe('Repository short names'),
|
|
12
12
|
types: z.array(z.string()).optional().describe('VCS types: git, hg, svn'),
|
|
13
13
|
uris: z.array(z.string()).optional().describe('Repository URIs'),
|
|
14
|
+
subscribers: z.array(z.string()).optional().describe('Subscriber user/project PHIDs'),
|
|
15
|
+
spaces: z.array(z.string()).optional().describe('Space PHIDs (for multi-space installations)'),
|
|
14
16
|
query: z.string().optional().describe('Full-text search query'),
|
|
15
17
|
})).optional().describe('Search constraints'),
|
|
16
18
|
attachments: jsonCoerce(z.object({
|
|
@@ -38,6 +40,10 @@ export function registerDiffusionTools(server, client) {
|
|
|
38
40
|
auditors: z.array(z.string()).optional().describe('Auditor user/project PHIDs'),
|
|
39
41
|
responsiblePHIDs: z.array(z.string()).optional().describe('User PHIDs responsible (as author or auditor)'),
|
|
40
42
|
statuses: z.array(z.string()).optional().describe('Audit statuses: none, needs-audit, concern-raised, partially-audited, audited, needs-verification'),
|
|
43
|
+
packages: z.array(z.string()).optional().describe('Owners package PHIDs'),
|
|
44
|
+
unreachable: z.boolean().optional().describe('Include unreachable commits'),
|
|
45
|
+
permanent: z.boolean().optional().describe('Filter by permanent (reachable from any permanent ref) status'),
|
|
46
|
+
ancestorsOf: z.array(z.string()).optional().describe('Find ancestors of these commit identifiers'),
|
|
41
47
|
query: z.string().optional().describe('Full-text search query'),
|
|
42
48
|
})).optional().describe('Search constraints'),
|
|
43
49
|
attachments: jsonCoerce(z.object({
|
package/dist/tools/feed.js
CHANGED
|
@@ -5,8 +5,8 @@ export function registerFeedTools(server, client) {
|
|
|
5
5
|
filterPHIDs: z.array(z.string()).optional().describe('Only show activity involving these PHIDs (user, project, task, etc.)'),
|
|
6
6
|
view: z.enum(['data', 'text', 'html', 'html-summary']).optional().describe('Output format: "data" (structured, default), "text" (human-readable), "html" (rendered HTML), "html-summary" (title only)'),
|
|
7
7
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
8
|
-
after: z.
|
|
9
|
-
before: z.
|
|
8
|
+
after: z.coerce.number().optional().describe('Cursor for pagination (chronological key from previous results)'),
|
|
9
|
+
before: z.coerce.number().optional().describe('Cursor for reverse pagination'),
|
|
10
10
|
}, async (params) => {
|
|
11
11
|
const result = await client.call('feed.query', params);
|
|
12
12
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/file.js
CHANGED
|
@@ -20,8 +20,10 @@ export function registerFileTools(server, client) {
|
|
|
20
20
|
phids: z.array(z.string()).optional().describe('File PHIDs'),
|
|
21
21
|
authorPHIDs: z.array(z.string()).optional().describe('Author PHIDs'),
|
|
22
22
|
name: z.string().optional().describe('File name substring search'),
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
createdStart: z.coerce.number().optional().describe('Created after (epoch timestamp)'),
|
|
24
|
+
createdEnd: z.coerce.number().optional().describe('Created before (epoch timestamp)'),
|
|
25
|
+
explicit: z.boolean().optional().describe('Filter to explicitly uploaded files only'),
|
|
26
|
+
subscribers: z.array(z.string()).optional().describe('Subscriber user/project PHIDs'),
|
|
25
27
|
})).optional().describe('Search constraints'),
|
|
26
28
|
order: z.string().optional().describe('Result order'),
|
|
27
29
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
@@ -11,9 +11,6 @@ export function registerHarbormasterTools(server, client) {
|
|
|
11
11
|
containerPHIDs: z.array(z.string()).optional().describe('Container PHIDs'),
|
|
12
12
|
statuses: z.array(z.string()).optional().describe('Buildable statuses'),
|
|
13
13
|
})).optional().describe('Search constraints'),
|
|
14
|
-
attachments: jsonCoerce(z.object({
|
|
15
|
-
builds: z.boolean().optional().describe('Include builds for each buildable'),
|
|
16
|
-
})).optional().describe('Data attachments'),
|
|
17
14
|
order: z.string().optional().describe('Result order'),
|
|
18
15
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
19
16
|
after: z.string().optional().describe('Cursor for next-page pagination'),
|
|
@@ -33,9 +30,6 @@ export function registerHarbormasterTools(server, client) {
|
|
|
33
30
|
statuses: z.array(z.string()).optional().describe('Build statuses: building, passed, failed, aborted, error, paused'),
|
|
34
31
|
initiatorPHIDs: z.array(z.string()).optional().describe('PHIDs of users/objects that initiated the build'),
|
|
35
32
|
})).optional().describe('Search constraints'),
|
|
36
|
-
attachments: jsonCoerce(z.object({
|
|
37
|
-
targets: z.boolean().optional().describe('Include build targets for each build'),
|
|
38
|
-
})).optional().describe('Data attachments'),
|
|
39
33
|
order: z.string().optional().describe('Result order'),
|
|
40
34
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
41
35
|
after: z.string().optional().describe('Cursor for next-page pagination'),
|
|
@@ -51,6 +45,11 @@ export function registerHarbormasterTools(server, client) {
|
|
|
51
45
|
ids: z.array(z.coerce.number()).optional().describe('Target IDs'),
|
|
52
46
|
phids: z.array(z.string()).optional().describe('Target PHIDs'),
|
|
53
47
|
buildPHIDs: z.array(z.string()).optional().describe('Build PHIDs'),
|
|
48
|
+
statuses: z.array(z.string()).optional().describe('Target statuses'),
|
|
49
|
+
dateCreatedStart: z.coerce.number().optional().describe('Created after (epoch timestamp)'),
|
|
50
|
+
dateCreatedEnd: z.coerce.number().optional().describe('Created before (epoch timestamp)'),
|
|
51
|
+
dateModifiedStart: z.coerce.number().optional().describe('Modified after (epoch timestamp)'),
|
|
52
|
+
dateModifiedEnd: z.coerce.number().optional().describe('Modified before (epoch timestamp)'),
|
|
54
53
|
})).optional().describe('Search constraints'),
|
|
55
54
|
order: z.string().optional().describe('Result order'),
|
|
56
55
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
@@ -68,9 +67,6 @@ export function registerHarbormasterTools(server, client) {
|
|
|
68
67
|
phids: z.array(z.string()).optional().describe('Log PHIDs'),
|
|
69
68
|
buildTargetPHIDs: z.array(z.string()).optional().describe('Build target PHIDs'),
|
|
70
69
|
})).optional().describe('Search constraints'),
|
|
71
|
-
attachments: jsonCoerce(z.object({
|
|
72
|
-
content: z.boolean().optional().describe('Include actual log text content'),
|
|
73
|
-
})).optional().describe('Data attachments'),
|
|
74
70
|
order: z.string().optional().describe('Result order'),
|
|
75
71
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
76
72
|
after: z.string().optional().describe('Cursor for next-page pagination'),
|
|
@@ -122,7 +118,7 @@ export function registerHarbormasterTools(server, client) {
|
|
|
122
118
|
constraints: jsonCoerce(z.object({
|
|
123
119
|
ids: z.array(z.coerce.number()).optional().describe('Build plan IDs'),
|
|
124
120
|
phids: z.array(z.string()).optional().describe('Build plan PHIDs'),
|
|
125
|
-
|
|
121
|
+
status: z.array(z.string()).optional().describe('Plan statuses: "active", "disabled"'),
|
|
126
122
|
match: z.string().optional().describe('Search for build plans by name substring'),
|
|
127
123
|
})).optional().describe('Search constraints'),
|
|
128
124
|
order: z.string().optional().describe('Result order'),
|
package/dist/tools/maniphest.js
CHANGED
|
@@ -24,6 +24,9 @@ export function registerManiphestTools(server, client) {
|
|
|
24
24
|
hasParents: z.boolean().optional().describe('Filter to tasks that have open parent tasks'),
|
|
25
25
|
hasSubtasks: z.boolean().optional().describe('Filter to tasks that have open subtasks'),
|
|
26
26
|
spacePHIDs: z.array(z.string()).optional().describe('Filter by Space PHIDs (for multi-space installations)'),
|
|
27
|
+
closedStart: z.coerce.number().optional().describe('Closed after (epoch timestamp)'),
|
|
28
|
+
closedEnd: z.coerce.number().optional().describe('Closed before (epoch timestamp)'),
|
|
29
|
+
closerPHIDs: z.array(z.string()).optional().describe('PHIDs of users who closed the task'),
|
|
27
30
|
})).optional().describe('Search constraints'),
|
|
28
31
|
attachments: jsonCoerce(z.object({
|
|
29
32
|
columns: z.boolean().optional().describe('Include workboard column info'),
|
package/dist/tools/owners.js
CHANGED
|
@@ -16,7 +16,6 @@ export function registerOwnersTools(server, client) {
|
|
|
16
16
|
query: z.string().optional().describe('Full-text search query'),
|
|
17
17
|
})).optional().describe('Search constraints'),
|
|
18
18
|
attachments: jsonCoerce(z.object({
|
|
19
|
-
owners: z.boolean().optional().describe('Include owner details'),
|
|
20
19
|
paths: z.boolean().optional().describe('Include owned paths'),
|
|
21
20
|
})).optional().describe('Data attachments'),
|
|
22
21
|
order: z.string().optional().describe('Result order'),
|
package/dist/tools/paste.js
CHANGED
|
@@ -10,6 +10,8 @@ export function registerPasteTools(server, client) {
|
|
|
10
10
|
authors: z.array(z.string()).optional().describe('Author PHIDs'),
|
|
11
11
|
languages: z.array(z.string()).optional().describe('Languages'),
|
|
12
12
|
statuses: z.array(z.string()).optional().describe('Statuses: active, archived'),
|
|
13
|
+
createdStart: z.coerce.number().optional().describe('Created after (epoch timestamp)'),
|
|
14
|
+
createdEnd: z.coerce.number().optional().describe('Created before (epoch timestamp)'),
|
|
13
15
|
query: z.string().optional().describe('Full-text search query'),
|
|
14
16
|
})).optional().describe('Search constraints'),
|
|
15
17
|
attachments: jsonCoerce(z.object({
|
package/dist/tools/phame.js
CHANGED
|
@@ -12,6 +12,7 @@ export function registerPhameTools(server, client) {
|
|
|
12
12
|
})).optional().describe('Search constraints'),
|
|
13
13
|
attachments: jsonCoerce(z.object({
|
|
14
14
|
subscribers: z.boolean().optional().describe('Include subscriber details'),
|
|
15
|
+
projects: z.boolean().optional().describe('Include tagged projects'),
|
|
15
16
|
})).optional().describe('Data attachments'),
|
|
16
17
|
order: z.string().optional().describe('Result order'),
|
|
17
18
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
@@ -29,11 +30,12 @@ export function registerPhameTools(server, client) {
|
|
|
29
30
|
phids: z.array(z.string()).optional().describe('Post PHIDs'),
|
|
30
31
|
blogPHIDs: z.array(z.string()).optional().describe('Filter by blog PHIDs'),
|
|
31
32
|
authorPHIDs: z.array(z.string()).optional().describe('Filter by author PHIDs'),
|
|
32
|
-
visibility: z.array(z.
|
|
33
|
+
visibility: z.array(z.string()).optional().describe('Visibility: "published", "draft", "archived" (or numeric: "1", "0", "2")'),
|
|
33
34
|
query: z.string().optional().describe('Full-text search query'),
|
|
34
35
|
})).optional().describe('Search constraints'),
|
|
35
36
|
attachments: jsonCoerce(z.object({
|
|
36
|
-
|
|
37
|
+
subscribers: z.boolean().optional().describe('Include subscriber details'),
|
|
38
|
+
projects: z.boolean().optional().describe('Include tagged projects'),
|
|
37
39
|
})).optional().describe('Data attachments'),
|
|
38
40
|
order: z.string().optional().describe('Result order'),
|
|
39
41
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
package/dist/tools/phriction.js
CHANGED
|
@@ -26,42 +26,24 @@ export function registerPhrictionTools(server, client) {
|
|
|
26
26
|
const result = await client.call('phriction.document.search', params);
|
|
27
27
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
28
28
|
});
|
|
29
|
-
//
|
|
30
|
-
server.tool('
|
|
31
|
-
|
|
32
|
-
title: z.string().
|
|
33
|
-
content: z.string().
|
|
34
|
-
|
|
35
|
-
move: z.string().optional().describe('New slug to move/rename the document to'),
|
|
36
|
-
addSubscriberPHIDs: z.array(z.string()).optional().describe('Subscriber PHIDs to add'),
|
|
37
|
-
removeSubscriberPHIDs: z.array(z.string()).optional().describe('Subscriber PHIDs to remove'),
|
|
29
|
+
// Create wiki document
|
|
30
|
+
server.tool('phabricator_document_create', 'Create a new Phriction wiki document. Uses phriction.create (the only method that can create documents).', {
|
|
31
|
+
slug: z.string().describe('Document slug/path (e.g., "projects/myproject/")'),
|
|
32
|
+
title: z.string().describe('Document title'),
|
|
33
|
+
content: z.string().describe('Document content (Remarkup)'),
|
|
34
|
+
description: z.string().optional().describe('Edit description/summary'),
|
|
38
35
|
}, async (params) => {
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
transactions.push({ type: 'move', value: params.move });
|
|
51
|
-
}
|
|
52
|
-
if (params.addSubscriberPHIDs !== undefined) {
|
|
53
|
-
transactions.push({ type: 'subscribers.add', value: params.addSubscriberPHIDs });
|
|
54
|
-
}
|
|
55
|
-
if (params.removeSubscriberPHIDs !== undefined) {
|
|
56
|
-
transactions.push({ type: 'subscribers.remove', value: params.removeSubscriberPHIDs });
|
|
57
|
-
}
|
|
58
|
-
if (transactions.length === 0) {
|
|
59
|
-
return { content: [{ type: 'text', text: 'No changes specified' }] };
|
|
60
|
-
}
|
|
61
|
-
const result = await client.call('phriction.document.edit', {
|
|
62
|
-
objectIdentifier: params.objectIdentifier,
|
|
63
|
-
transactions,
|
|
64
|
-
});
|
|
36
|
+
const result = await client.call('phriction.create', params);
|
|
37
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
38
|
+
});
|
|
39
|
+
// Edit wiki document content
|
|
40
|
+
server.tool('phabricator_document_edit', 'Edit an existing Phriction wiki document title or content. Uses phriction.edit (the only method that can update document content).', {
|
|
41
|
+
slug: z.string().describe('Document slug/path (e.g., "projects/myproject/")'),
|
|
42
|
+
title: z.string().optional().describe('New document title'),
|
|
43
|
+
content: z.string().optional().describe('New document content (Remarkup)'),
|
|
44
|
+
description: z.string().optional().describe('Edit description/summary'),
|
|
45
|
+
}, async (params) => {
|
|
46
|
+
const result = await client.call('phriction.edit', params);
|
|
65
47
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
66
48
|
});
|
|
67
49
|
// Add comment to document
|
package/dist/tools/project.js
CHANGED
|
@@ -16,6 +16,10 @@ export function registerProjectTools(server, client) {
|
|
|
16
16
|
icons: z.array(z.string()).optional().describe('Filter by project icon'),
|
|
17
17
|
isMilestone: z.boolean().optional().describe('Filter milestones'),
|
|
18
18
|
isRoot: z.boolean().optional().describe('Filter root projects'),
|
|
19
|
+
minDepth: z.coerce.number().optional().describe('Minimum project depth (0 = root)'),
|
|
20
|
+
maxDepth: z.coerce.number().optional().describe('Maximum project depth'),
|
|
21
|
+
subtypes: z.array(z.string()).optional().describe('Project subtypes'),
|
|
22
|
+
colors: z.array(z.string()).optional().describe('Project colors'),
|
|
19
23
|
query: z.string().optional().describe('Full-text search query'),
|
|
20
24
|
})).optional().describe('Search constraints'),
|
|
21
25
|
attachments: jsonCoerce(z.object({
|
|
@@ -106,9 +110,6 @@ export function registerProjectTools(server, client) {
|
|
|
106
110
|
phids: z.array(z.string()).optional().describe('Column PHIDs'),
|
|
107
111
|
projects: z.array(z.string()).optional().describe('Project PHIDs'),
|
|
108
112
|
})).optional().describe('Search constraints'),
|
|
109
|
-
attachments: jsonCoerce(z.object({
|
|
110
|
-
items: z.boolean().optional().describe('Include items (tasks) in each column'),
|
|
111
|
-
})).optional().describe('Data attachments'),
|
|
112
113
|
order: z.string().optional().describe('Result order'),
|
|
113
114
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
114
115
|
after: z.string().optional().describe('Cursor for next-page pagination'),
|
|
@@ -8,7 +8,8 @@ export function registerTransactionTools(server, client) {
|
|
|
8
8
|
authorPHIDs: z.array(z.string()).optional().describe('Author PHIDs'),
|
|
9
9
|
})).optional().describe('Search constraints'),
|
|
10
10
|
limit: z.coerce.number().max(100).optional().describe('Maximum results (max 100)'),
|
|
11
|
-
after: z.string().optional().describe('
|
|
11
|
+
after: z.string().optional().describe('Cursor for next-page pagination'),
|
|
12
|
+
before: z.string().optional().describe('Cursor for previous-page pagination'),
|
|
12
13
|
}, async (params) => {
|
|
13
14
|
const { objectIdentifier, ...searchParams } = params;
|
|
14
15
|
const result = await client.call('transaction.search', {
|
package/dist/tools/user.js
CHANGED
|
@@ -18,6 +18,7 @@ export function registerUserTools(server, client) {
|
|
|
18
18
|
isDisabled: z.boolean().optional().describe('Filter by disabled status'),
|
|
19
19
|
isBot: z.boolean().optional().describe('Filter by bot status'),
|
|
20
20
|
isMailingList: z.boolean().optional().describe('Filter by mailing list status'),
|
|
21
|
+
needsApproval: z.boolean().optional().describe('Filter to users awaiting admin approval'),
|
|
21
22
|
createdStart: z.coerce.number().optional().describe('Created after (epoch timestamp)'),
|
|
22
23
|
createdEnd: z.coerce.number().optional().describe('Created before (epoch timestamp)'),
|
|
23
24
|
query: z.string().optional().describe('Full-text search query'),
|
package/package.json
CHANGED