@orboto/mcp 0.209.1 → 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 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 (all projects, users, config, attachments); returns the job id to poll via orboto_list_backups.',
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 (scope, actors, functional + non-functional requirements).',
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 dependency-based critical path for a project or milestone: the blocking chain of tickets that determines the earliest finish.',
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.209.1",
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",