@orboto/mcp 0.209.0 → 0.210.0
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/dist/server.js +2 -0
- package/dist/tool-docs.js +11 -3
- package/dist/tools/feedback-reply.js +23 -0
- package/dist/tools/feedback-reply.test.js +27 -0
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -74,6 +74,7 @@ import { primerFactListToolConfig, makePrimerFactListHandler, primerFactAddToolC
|
|
|
74
74
|
import { whoamiToolConfig, makeWhoamiHandler } from './tools/identity.js';
|
|
75
75
|
import { claimToolConfig, makeClaimHandler, unclaimToolConfig, makeUnclaimHandler, } from './tools/claim.js';
|
|
76
76
|
import { reportFeedbackToolConfig, makeReportFeedbackHandler } from './tools/feedback.js';
|
|
77
|
+
import { feedbackReplyToolConfig, makeFeedbackReplyHandler } from './tools/feedback-reply.js';
|
|
77
78
|
import { listApprovalsToolConfig, makeListApprovalsHandler, approvalDecideToolConfig, makeApprovalDecideHandler, } from './tools/approvals.js';
|
|
78
79
|
import { reviewFingerprintToolConfig, makeReviewFingerprintHandler, reviewPolicyCheckToolConfig, makeReviewPolicyCheckHandler, reviewApprovalRecordToolConfig, makeReviewApprovalRecordHandler, } from './tools/review-policy.js';
|
|
79
80
|
import { createMilestoneToolConfig, makeCreateMilestoneHandler, closeMilestoneToolConfig, makeCloseMilestoneHandler, updateMilestoneToolConfig, makeUpdateMilestoneHandler, } from './tools/milestones.js';
|
|
@@ -339,6 +340,7 @@ export async function buildOrbotoMcpServer(opts) {
|
|
|
339
340
|
reg('orboto_claim', claimToolConfig, makeClaimHandler(client));
|
|
340
341
|
reg('orboto_unclaim', unclaimToolConfig, makeUnclaimHandler(client));
|
|
341
342
|
reg('orboto_report_feedback', reportFeedbackToolConfig, makeReportFeedbackHandler(client));
|
|
343
|
+
reg('orboto_feedback_reply', feedbackReplyToolConfig, makeFeedbackReplyHandler(client));
|
|
342
344
|
reg('orboto_list_approvals', listApprovalsToolConfig, makeListApprovalsHandler(client));
|
|
343
345
|
reg('orboto_approval_decide', approvalDecideToolConfig, makeApprovalDecideHandler(client));
|
|
344
346
|
reg('orboto_review_fingerprint', reviewFingerprintToolConfig, makeReviewFingerprintHandler(client));
|
package/dist/tool-docs.js
CHANGED
|
@@ -12,12 +12,20 @@ export const SUMMARY_MAX_CHARS = 220;
|
|
|
12
12
|
* name the key inputs.
|
|
13
13
|
*/
|
|
14
14
|
const SUMMARY_OVERRIDES = {
|
|
15
|
-
orboto_create_full_backup: 'Start a full-workspace backup job
|
|
15
|
+
orboto_create_full_backup: 'Start a full-workspace backup job; returns the job id to poll via orboto_list_backups.',
|
|
16
16
|
orboto_get_ticket: 'Fetch one ticket by key or UUID with description, status, assignees, checklists and comments.',
|
|
17
|
-
orboto_requirements_spec: 'Generate a structured requirements spec for a project or milestone from its tickets
|
|
17
|
+
orboto_requirements_spec: 'Generate a structured requirements spec for a project or milestone from its tickets.',
|
|
18
18
|
orboto_update_doc_space: 'Update a doc space\'s name, description, icon, project binding or access mode (open/restricted) by space id.',
|
|
19
19
|
orboto_search_docs: 'Full-text search over doc/wiki pages (query, optional space or project filter); returns matching pages with snippets.',
|
|
20
|
-
orboto_critical_path: 'Compute the
|
|
20
|
+
orboto_critical_path: 'Compute the critical path (blocking dependency chain) for a project or milestone.',
|
|
21
|
+
/** ORB-2237 - shortened summaries that pay for `orboto_feedback_reply`; each tool's full text stays in `getToolDoc`. */
|
|
22
|
+
orboto_agent_broadcast: 'Fan-out a message to every agent in a workspace, project or topic scope.',
|
|
23
|
+
orboto_api_search: 'Discover REST API endpoints on demand - the escape hatch for any orboto endpoint.',
|
|
24
|
+
orboto_get_doc: 'Return a doc\'s content (Markdown) plus its backlinks.',
|
|
25
|
+
orboto_primer_fact_list: 'List structured project facts feeding the AI primer.',
|
|
26
|
+
orboto_bulk_move_tickets: 'Move every matching ticket to the same status category.',
|
|
27
|
+
orboto_resolve_doc_smart_links: 'Resolve doc/ticket/milestone/project smart-link references to their title + URL.',
|
|
28
|
+
orboto_admin_translation_revert: 'Restore the pre-translation title + description and clear the translation marker.',
|
|
21
29
|
};
|
|
22
30
|
/** Runtime registry: tool name -> full guidance text, captured at
|
|
23
31
|
* registration. Module-global on purpose - the HTTP transport builds one
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ORB-2237 - `orboto_feedback_reply`: the operator's public reply to a
|
|
3
|
+
* tenant report, one step (POST /tickets/:id/feedback-reply).
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
export const feedbackReplyToolConfig = {
|
|
7
|
+
title: 'Reply to feedback report',
|
|
8
|
+
description: 'Post the operator\'s public reply on a feedback ticket. Synced to the tenant. Refuses secrets.',
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
ticketKey: z.string().min(1).max(64),
|
|
11
|
+
content: z.string().min(1).max(20_000),
|
|
12
|
+
}).shape,
|
|
13
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
14
|
+
};
|
|
15
|
+
export function makeFeedbackReplyHandler(client) {
|
|
16
|
+
return async (args) => {
|
|
17
|
+
const res = await client.post(`/tickets/${encodeURIComponent(args.ticketKey)}/feedback-reply`, { content: args.content });
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: 'text', text: `Reply posted on ${args.ticketKey} (comment ${res.commentId}, ${res.repliedAt}).` }],
|
|
20
|
+
structuredContent: res,
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ORB-2237 - `orboto_feedback_reply` unit test.
|
|
3
|
+
*/
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { OrbotoClient } from '../orboto-client.js';
|
|
6
|
+
import { makeFeedbackReplyHandler } from './feedback-reply.js';
|
|
7
|
+
beforeEach(() => { vi.restoreAllMocks(); });
|
|
8
|
+
afterEach(() => { vi.restoreAllMocks(); });
|
|
9
|
+
const client = new OrbotoClient({ baseUrl: 'http://api.test', apiKey: 'orb_test' });
|
|
10
|
+
describe('orboto_feedback_reply', () => {
|
|
11
|
+
it('posts the reply to the feedback-reply route and reports the comment id', async () => {
|
|
12
|
+
const calls = [];
|
|
13
|
+
vi.spyOn(globalThis, 'fetch').mockImplementation(async (url, init) => {
|
|
14
|
+
calls.push({ url: url.toString(), body: init?.body ? JSON.parse(init.body) : undefined });
|
|
15
|
+
return {
|
|
16
|
+
ok: true, status: 200, statusText: 'OK',
|
|
17
|
+
json: async () => ({ commentId: 'c-1', repliedAt: '2026-09-28T10:00:00.000Z' }),
|
|
18
|
+
text: async () => '',
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
const result = await makeFeedbackReplyHandler(client)({ ticketKey: 'FBK-1', content: 'Fixed in the next release.' });
|
|
22
|
+
expect(calls[0].url).toContain('/tickets/FBK-1/feedback-reply');
|
|
23
|
+
expect(calls[0].body).toEqual({ content: 'Fixed in the next release.' });
|
|
24
|
+
expect(result.structuredContent).toEqual({ commentId: 'c-1', repliedAt: '2026-09-28T10:00:00.000Z' });
|
|
25
|
+
expect(result.content[0]).toMatchObject({ type: 'text' });
|
|
26
|
+
});
|
|
27
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orboto/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.210.0",
|
|
4
4
|
"description": "Model Context Protocol server for orboto - exposes tickets, projects, milestones, time, docs, primer-facts, alerts and absences as MCP tools for Claude Desktop / Cursor / Copilot Chat / any MCP-aware AI client.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|