@orboto/mcp 0.178.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/LICENSE.md +21 -0
- package/README.md +123 -0
- package/dist/event-bridge.js +250 -0
- package/dist/event-bridge.test.js +165 -0
- package/dist/http-transport-binding.test.js +151 -0
- package/dist/http-transport.js +608 -0
- package/dist/http-transport.test.js +408 -0
- package/dist/index.js +128 -0
- package/dist/input-schema.js +293 -0
- package/dist/input-schema.test.js +198 -0
- package/dist/instructions-budget.test.js +34 -0
- package/dist/manifest-size.test.js +192 -0
- package/dist/mcp-instrument.js +24 -0
- package/dist/oauth-bootstrap.js +413 -0
- package/dist/oauth-bootstrap.test.js +212 -0
- package/dist/orboto-client.js +250 -0
- package/dist/orboto-client.test.js +141 -0
- package/dist/prompts.js +219 -0
- package/dist/prompts.test.js +79 -0
- package/dist/protect-text-usage.test.js +38 -0
- package/dist/resources.js +260 -0
- package/dist/resources.test.js +191 -0
- package/dist/response-budget.js +515 -0
- package/dist/response-budget.test.js +343 -0
- package/dist/server.js +547 -0
- package/dist/session-nudge.js +81 -0
- package/dist/session-nudge.test.js +100 -0
- package/dist/session-nudge.transport.test.js +100 -0
- package/dist/tool-annotations.test.js +97 -0
- package/dist/tool-docs.js +64 -0
- package/dist/tool-docs.test.js +90 -0
- package/dist/tool-parameters.test.js +145 -0
- package/dist/tools/absence-writes.js +93 -0
- package/dist/tools/absence-writes.test.js +106 -0
- package/dist/tools/admin-translations.js +83 -0
- package/dist/tools/admin-writes.js +174 -0
- package/dist/tools/admin-writes.test.js +120 -0
- package/dist/tools/agent-coordination.js +160 -0
- package/dist/tools/agent-coordination.test.js +156 -0
- package/dist/tools/agent-drift.js +79 -0
- package/dist/tools/agent-drift.test.js +87 -0
- package/dist/tools/agent-instructions.js +172 -0
- package/dist/tools/agent-instructions.test.js +124 -0
- package/dist/tools/agent-messages.js +75 -0
- package/dist/tools/ai-status.js +55 -0
- package/dist/tools/ai-status.test.js +43 -0
- package/dist/tools/ai-usage.js +68 -0
- package/dist/tools/analytics.js +72 -0
- package/dist/tools/analytics.test.js +71 -0
- package/dist/tools/api-call.js +72 -0
- package/dist/tools/api-call.test.js +104 -0
- package/dist/tools/api-search.js +77 -0
- package/dist/tools/api-search.test.js +90 -0
- package/dist/tools/approvals.js +68 -0
- package/dist/tools/approvals.test.js +48 -0
- package/dist/tools/attach.js +108 -0
- package/dist/tools/attach.test.js +117 -0
- package/dist/tools/backup.js +93 -0
- package/dist/tools/backup.test.js +108 -0
- package/dist/tools/bulk-create.js +213 -0
- package/dist/tools/bulk-create.test.js +135 -0
- package/dist/tools/bulk-writes.js +339 -0
- package/dist/tools/bulk-writes.test.js +239 -0
- package/dist/tools/check-similar.js +84 -0
- package/dist/tools/check-similar.test.js +101 -0
- package/dist/tools/checklist-writes.js +202 -0
- package/dist/tools/checklist-writes.test.js +184 -0
- package/dist/tools/claim.js +236 -0
- package/dist/tools/claim.test.js +207 -0
- package/dist/tools/critical-path.js +83 -0
- package/dist/tools/critical-path.test.js +114 -0
- package/dist/tools/cross-project-links.ee.js +124 -0
- package/dist/tools/cross-project-links.ee.test.js +163 -0
- package/dist/tools/customer-report.js +88 -0
- package/dist/tools/customer-report.test.js +55 -0
- package/dist/tools/doc-attachments.js +184 -0
- package/dist/tools/doc-attachments.test.js +136 -0
- package/dist/tools/doc-comments.js +228 -0
- package/dist/tools/doc-comments.test.js +192 -0
- package/dist/tools/doc-edits.js +229 -0
- package/dist/tools/doc-edits.test.js +218 -0
- package/dist/tools/doc-export.js +87 -0
- package/dist/tools/doc-export.test.js +109 -0
- package/dist/tools/doc-revisions.js +133 -0
- package/dist/tools/doc-revisions.test.js +103 -0
- package/dist/tools/docs-ai.js +171 -0
- package/dist/tools/docs-ai.test.js +160 -0
- package/dist/tools/docs.js +557 -0
- package/dist/tools/docs.test.js +365 -0
- package/dist/tools/embedding-status.js +100 -0
- package/dist/tools/embedding-status.test.js +86 -0
- package/dist/tools/free-busy.js +49 -0
- package/dist/tools/free-busy.test.js +46 -0
- package/dist/tools/get-checklists.js +72 -0
- package/dist/tools/get-project-primer.js +58 -0
- package/dist/tools/get-project.js +77 -0
- package/dist/tools/get-ticket.js +321 -0
- package/dist/tools/get-timer.js +62 -0
- package/dist/tools/help.js +44 -0
- package/dist/tools/identity.js +60 -0
- package/dist/tools/identity.test.js +67 -0
- package/dist/tools/list-git-app-installations.js +45 -0
- package/dist/tools/list-projects.js +72 -0
- package/dist/tools/list-projects.test.js +67 -0
- package/dist/tools/list-tickets.js +86 -0
- package/dist/tools/milestones-crud.test.js +154 -0
- package/dist/tools/milestones.js +279 -0
- package/dist/tools/milestones.test.js +60 -0
- package/dist/tools/my-tickets.js +65 -0
- package/dist/tools/personal-facts.js +72 -0
- package/dist/tools/personal-facts.test.js +45 -0
- package/dist/tools/phase-b-tools.test.js +530 -0
- package/dist/tools/portfolio.js +56 -0
- package/dist/tools/primer-facts.js +346 -0
- package/dist/tools/primer-facts.test.js +353 -0
- package/dist/tools/project-listings.js +116 -0
- package/dist/tools/project-listings.test.js +106 -0
- package/dist/tools/query.js +65 -0
- package/dist/tools/query.test.js +128 -0
- package/dist/tools/raci.js +108 -0
- package/dist/tools/raci.test.js +70 -0
- package/dist/tools/requirements-spec.js +89 -0
- package/dist/tools/requirements-spec.test.js +62 -0
- package/dist/tools/response-expand.js +104 -0
- package/dist/tools/review-policy.js +105 -0
- package/dist/tools/review-policy.test.js +71 -0
- package/dist/tools/search.js +78 -0
- package/dist/tools/session-start.js +435 -0
- package/dist/tools/session-start.test.js +568 -0
- package/dist/tools/set-parent.js +76 -0
- package/dist/tools/set-parent.test.js +115 -0
- package/dist/tools/shared.js +226 -0
- package/dist/tools/shared.test.js +169 -0
- package/dist/tools/similar-projection.js +30 -0
- package/dist/tools/ticket-attachments.js +131 -0
- package/dist/tools/ticket-attachments.test.js +106 -0
- package/dist/tools/ticket-schedules.js +112 -0
- package/dist/tools/ticket-schedules.test.js +102 -0
- package/dist/tools/ticket-writes.js +778 -0
- package/dist/tools/ticket-writes.test.js +643 -0
- package/dist/tools/time-writes.js +238 -0
- package/dist/tools/time-writes.test.js +138 -0
- package/dist/tools/update-project.js +165 -0
- package/dist/tools/update-project.test.js +172 -0
- package/dist/tools/wiki.js +185 -0
- package/dist/tools/wiki.test.js +104 -0
- package/dist/tools/work-sessions-next.test.js +150 -0
- package/dist/tools/work-sessions-start.test.js +174 -0
- package/dist/tools/work-sessions.js +709 -0
- package/dist/tools/work-sessions.test.js +358 -0
- package/dist/toolset.js +149 -0
- package/dist/toolset.test.js +150 -0
- package/dist/version-guard.test.js +51 -0
- package/dist/version.js +28 -0
- package/dist/with-metrics-mail-nudge.test.js +41 -0
- package/dist/with-metrics-output-schema.test.js +91 -0
- package/dist/with-metrics.js +211 -0
- package/dist/with-metrics.test.js +230 -0
- package/package.json +66 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ORB-244 Phase A/B - MCP server factory.
|
|
3
|
+
*
|
|
4
|
+
* Builds an `McpServer` with the registered tool set + a handle to
|
|
5
|
+
* the orboto REST client. Transport is picked by the process entry
|
|
6
|
+
* point (`index.ts`) based on `ORBOTO_MCP_TRANSPORT=stdio|http`.
|
|
7
|
+
*
|
|
8
|
+
* Keeping the server factory transport-agnostic means `server.ts` is
|
|
9
|
+
* the same object whether we ship stdio for Local-Proxy (Phase G
|
|
10
|
+
* `@orboto/mcp-cli`) or HTTP-SSE for Self-Hosted-inline.
|
|
11
|
+
*
|
|
12
|
+
* Tool registrations stay in this file so adding a new tool in
|
|
13
|
+
* Phase C is one diff here + one new file in `tools/`. Phase D will
|
|
14
|
+
* add `registerResource` / `registerPrompt` calls here too.
|
|
15
|
+
*/
|
|
16
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
17
|
+
import { VERSION } from './version.js';
|
|
18
|
+
import { SubscribeRequestSchema, UnsubscribeRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
19
|
+
import { OrbotoClient } from './orboto-client.js';
|
|
20
|
+
import { registerOrbotoResources } from './resources.js';
|
|
21
|
+
import { registerOrbotoPrompts } from './prompts.js';
|
|
22
|
+
import { registerWithMetrics } from './with-metrics.js';
|
|
23
|
+
import { resolveToolset, toolInToolset } from './toolset.js';
|
|
24
|
+
import { createNudgeState } from './session-nudge.js';
|
|
25
|
+
import { aiStatusToolConfig, makeAiStatusHandler } from './tools/ai-status.js';
|
|
26
|
+
import { embeddingStatusToolConfig, makeEmbeddingStatusHandler } from './tools/embedding-status.js';
|
|
27
|
+
import { aiUsageToolConfig, makeAiUsageHandler } from './tools/ai-usage.js';
|
|
28
|
+
import { sessionStartToolConfig, makeSessionStartHandler } from './tools/session-start.js';
|
|
29
|
+
import { responseExpandToolConfig, makeResponseExpandHandler } from './tools/response-expand.js';
|
|
30
|
+
import { helpToolConfig, makeHelpHandler } from './tools/help.js';
|
|
31
|
+
import { apiSearchToolConfig, makeApiSearchHandler } from './tools/api-search.js';
|
|
32
|
+
import { apiCallToolConfig, makeApiCallHandler } from './tools/api-call.js';
|
|
33
|
+
import { listAgentInstructionsToolConfig, makeListAgentInstructionsHandler, createAgentInstructionToolConfig, makeCreateAgentInstructionHandler, updateAgentInstructionToolConfig, makeUpdateAgentInstructionHandler, resetAgentInstructionToolConfig, makeResetAgentInstructionHandler, deleteAgentInstructionToolConfig, makeDeleteAgentInstructionHandler, } from './tools/agent-instructions.js';
|
|
34
|
+
import { agentHeartbeatToolConfig, makeAgentHeartbeatHandler, agentPresenceToolConfig, makeAgentPresenceHandler, agentNotifyToolConfig, makeAgentNotifyHandler, } from './tools/agent-coordination.js';
|
|
35
|
+
import { agentBroadcastToolConfig, makeAgentBroadcastHandler, } from './tools/agent-coordination.js';
|
|
36
|
+
import { agentMessagesToolConfig, makeAgentMessagesHandler } from './tools/agent-messages.js';
|
|
37
|
+
import { listProjectsToolConfig, makeListProjectsHandler } from './tools/list-projects.js';
|
|
38
|
+
import { getProjectToolConfig, makeGetProjectHandler } from './tools/get-project.js';
|
|
39
|
+
import { getProjectPrimerToolConfig, makeGetProjectPrimerHandler } from './tools/get-project-primer.js';
|
|
40
|
+
import { listTicketsToolConfig, makeListTicketsHandler } from './tools/list-tickets.js';
|
|
41
|
+
import { criticalPathToolConfig, makeCriticalPathHandler } from './tools/critical-path.js';
|
|
42
|
+
import { analyticsToolConfig, makeAnalyticsHandler } from './tools/analytics.js';
|
|
43
|
+
import { portfolioSummaryToolConfig, makePortfolioSummaryHandler } from './tools/portfolio.js';
|
|
44
|
+
import { raciToolConfig, makeRaciHandler, setRaciToolConfig, makeSetRaciHandler } from './tools/raci.js';
|
|
45
|
+
import { getTicketToolConfig, makeGetTicketHandler } from './tools/get-ticket.js';
|
|
46
|
+
import { myTicketsToolConfig, makeMyTicketsHandler } from './tools/my-tickets.js';
|
|
47
|
+
import { listMilestonesToolConfig, makeListMilestonesHandler, getMilestoneToolConfig, makeGetMilestoneHandler, } from './tools/milestones.js';
|
|
48
|
+
import { searchToolConfig, makeSearchHandler } from './tools/search.js';
|
|
49
|
+
import { queryToolConfig, makeQueryHandler } from './tools/query.js';
|
|
50
|
+
import { customerReportToolConfig, makeCustomerReportHandler } from './tools/customer-report.js';
|
|
51
|
+
import { requirementsSpecToolConfig, makeRequirementsSpecHandler } from './tools/requirements-spec.js';
|
|
52
|
+
import { wikiIngestUrlToolConfig, makeWikiIngestUrlHandler, wikiAskToolConfig, makeWikiAskHandler, wikiLintToolConfig, makeWikiLintHandler, wikiPlanUpdateToolConfig, makeWikiPlanUpdateHandler, wikiApplyPlanToolConfig, makeWikiApplyPlanHandler, wikiRecordToolConfig, makeWikiRecordHandler, wikiAppendSectionToolConfig, makeWikiAppendSectionHandler, wikiFlagStaleToolConfig, makeWikiFlagStaleHandler, wikiSaveAnswerToolConfig, makeWikiSaveAnswerHandler, } from './tools/wiki.js';
|
|
53
|
+
import { personalFactListToolConfig, makePersonalFactListHandler, personalFactAddToolConfig, makePersonalFactAddHandler, personalFactUpdateToolConfig, makePersonalFactUpdateHandler, personalFactDeleteToolConfig, makePersonalFactDeleteHandler, } from './tools/personal-facts.js';
|
|
54
|
+
import { listDocSpacesToolConfig, makeListDocSpacesHandler, getDocToolConfig, makeGetDocHandler, createDocSpaceToolConfig, makeCreateDocSpaceHandler, updateDocSpaceToolConfig, makeUpdateDocSpaceHandler, deleteDocSpaceToolConfig, makeDeleteDocSpaceHandler, listDocsInSpaceToolConfig, makeListDocsInSpaceHandler, createDocToolConfig, makeCreateDocHandler, updateDocToolConfig, makeUpdateDocHandler, deleteDocToolConfig, makeDeleteDocHandler, moveDocToolConfig, makeMoveDocHandler, duplicateDocSpaceToolConfig, makeDuplicateDocSpaceHandler, resolveDocSmartLinksToolConfig, makeResolveDocSmartLinksHandler, } from './tools/docs.js';
|
|
55
|
+
import { searchDocsToolConfig, makeSearchDocsHandler, editDocToolConfig, makeEditDocHandler, editDocSectionToolConfig, makeEditDocSectionHandler, } from './tools/doc-edits.js';
|
|
56
|
+
import { uploadDocAttachmentToolConfig, makeUploadDocAttachmentHandler, listDocAttachmentsToolConfig, makeListDocAttachmentsHandler, deleteDocAttachmentToolConfig, makeDeleteDocAttachmentHandler, } from './tools/doc-attachments.js';
|
|
57
|
+
import { listTicketAttachmentsToolConfig, makeListTicketAttachmentsHandler, getAttachmentToolConfig, makeGetAttachmentHandler, } from './tools/ticket-attachments.js';
|
|
58
|
+
import { exportDocMdToolConfig, makeExportDocMdHandler, exportDocPdfToolConfig, makeExportDocPdfHandler, } from './tools/doc-export.js';
|
|
59
|
+
import { listDocRevisionsToolConfig, makeListDocRevisionsHandler, getDocRevisionToolConfig, makeGetDocRevisionHandler, restoreDocRevisionToolConfig, makeRestoreDocRevisionHandler, } from './tools/doc-revisions.js';
|
|
60
|
+
import { listDocCommentsToolConfig, makeListDocCommentsHandler, postDocCommentToolConfig, makePostDocCommentHandler, resolveDocCommentToolConfig, makeResolveDocCommentHandler, updateDocCommentToolConfig, makeUpdateDocCommentHandler, deleteDocCommentToolConfig, makeDeleteDocCommentHandler, } from './tools/doc-comments.js';
|
|
61
|
+
import { updatePublicHolidayToolConfig, makeUpdatePublicHolidayHandler, updateCompanyClosureToolConfig, makeUpdateCompanyClosureHandler, updateAbsenceToolConfig, makeUpdateAbsenceHandler, } from './tools/absence-writes.js';
|
|
62
|
+
import { listCrossProjectLinksToolConfig, makeListCrossProjectLinksHandler, addCrossProjectLinkToolConfig, makeAddCrossProjectLinkHandler, updateCrossProjectLinkToolConfig, makeUpdateCrossProjectLinkHandler, removeCrossProjectLinkToolConfig, makeRemoveCrossProjectLinkHandler, } from './tools/cross-project-links.ee.js';
|
|
63
|
+
import { getTimerToolConfig, makeGetTimerHandler } from './tools/get-timer.js';
|
|
64
|
+
import { getChecklistsToolConfig, makeGetChecklistsHandler } from './tools/get-checklists.js';
|
|
65
|
+
import { listGitAppInstallationsToolConfig, makeListGitAppInstallationsHandler } from './tools/list-git-app-installations.js';
|
|
66
|
+
import { createTicketToolConfig, makeCreateTicketHandler, updateTicketToolConfig, makeUpdateTicketHandler, moveTicketToolConfig, makeMoveTicketHandler, closeTicketToolConfig, makeCloseTicketHandler, deleteTicketToolConfig, makeDeleteTicketHandler, commentToolConfig, makeCommentHandler, updateCommentToolConfig, makeUpdateCommentHandler, deleteCommentToolConfig, makeDeleteCommentHandler, assignToolConfig, makeAssignHandler, unassignToolConfig, makeUnassignHandler, labelTicketToolConfig, makeLabelTicketHandler, unlabelTicketToolConfig, makeUnlabelTicketHandler, setMilestoneToolConfig, makeSetMilestoneHandler, addTicketDependencyToolConfig, makeAddTicketDependencyHandler, removeTicketDependencyToolConfig, makeRemoveTicketDependencyHandler, listTicketDependenciesToolConfig, makeListTicketDependenciesHandler, } from './tools/ticket-writes.js';
|
|
67
|
+
import { timerStartToolConfig, makeTimerStartHandler, timerStopToolConfig, makeTimerStopHandler, logTimeToolConfig, makeLogTimeHandler, listTimeEntriesToolConfig, makeListTimeEntriesHandler, editTimeEntryToolConfig, makeEditTimeEntryHandler, deleteTimeEntryToolConfig, makeDeleteTimeEntryHandler, } from './tools/time-writes.js';
|
|
68
|
+
import { listTicketSchedulesToolConfig, makeListTicketSchedulesHandler, scheduleTicketSessionToolConfig, makeScheduleTicketSessionHandler, cancelTicketSessionToolConfig, makeCancelTicketSessionHandler, } from './tools/ticket-schedules.js';
|
|
69
|
+
import { checkToolConfig, makeCheckHandler, uncheckToolConfig, makeUncheckHandler, addCheckToolConfig, makeAddCheckHandler, removeCheckToolConfig, makeRemoveCheckHandler, newChecklistToolConfig, makeNewChecklistHandler, } from './tools/checklist-writes.js';
|
|
70
|
+
import { listUsersToolConfig, makeListUsersHandler, getAuditLogToolConfig, makeGetAuditLogHandler, triggerBackupToolConfig, makeTriggerBackupHandler, } from './tools/admin-writes.js';
|
|
71
|
+
import { freeBusyToolConfig, makeFreeBusyHandler } from './tools/free-busy.js';
|
|
72
|
+
import { createFullBackupToolConfig, makeCreateFullBackupHandler, listBackupsToolConfig, makeListBackupsHandler, downloadBackupToolConfig, makeDownloadBackupHandler, } from './tools/backup.js';
|
|
73
|
+
import { primerFactListToolConfig, makePrimerFactListHandler, primerFactAddToolConfig, makePrimerFactAddHandler, primerFactUpdateToolConfig, makePrimerFactUpdateHandler, primerFactSupersedeToolConfig, makePrimerFactSupersedeHandler, primerFactVerifyToolConfig, makePrimerFactVerifyHandler, primerFactDeleteToolConfig, makePrimerFactDeleteHandler, } from './tools/primer-facts.js';
|
|
74
|
+
// ORB-799 - wrapper-feature-parity gap-close.
|
|
75
|
+
import { whoamiToolConfig, makeWhoamiHandler } from './tools/identity.js';
|
|
76
|
+
import { claimToolConfig, makeClaimHandler, unclaimToolConfig, makeUnclaimHandler, } from './tools/claim.js';
|
|
77
|
+
import { listApprovalsToolConfig, makeListApprovalsHandler, approvalDecideToolConfig, makeApprovalDecideHandler, } from './tools/approvals.js';
|
|
78
|
+
import { reviewFingerprintToolConfig, makeReviewFingerprintHandler, reviewPolicyCheckToolConfig, makeReviewPolicyCheckHandler, reviewApprovalRecordToolConfig, makeReviewApprovalRecordHandler, } from './tools/review-policy.js';
|
|
79
|
+
import { createMilestoneToolConfig, makeCreateMilestoneHandler, closeMilestoneToolConfig, makeCloseMilestoneHandler, updateMilestoneToolConfig, makeUpdateMilestoneHandler, } from './tools/milestones.js';
|
|
80
|
+
import { listTicketStatusesToolConfig, makeListTicketStatusesHandler, listLabelsToolConfig, makeListLabelsHandler, createLabelToolConfig, makeCreateLabelHandler, } from './tools/project-listings.js';
|
|
81
|
+
import { bulkPatchTicketsToolConfig, makeBulkPatchTicketsHandler, bulkMoveTicketsToolConfig, makeBulkMoveTicketsHandler, bulkCloseTicketsToolConfig, makeBulkCloseTicketsHandler, bulkCommentTicketsToolConfig, makeBulkCommentTicketsHandler, bulkAssignTicketsToolConfig, makeBulkAssignTicketsHandler, bulkUnassignTicketsToolConfig, makeBulkUnassignTicketsHandler, } from './tools/bulk-writes.js';
|
|
82
|
+
import { bulkCreateTicketsToolConfig, makeBulkCreateTicketsHandler, bulkAddTicketDependenciesToolConfig, makeBulkAddTicketDependenciesHandler, } from './tools/bulk-create.js';
|
|
83
|
+
import { askDocsToolConfig, makeAskDocsHandler, ingestUrlToolConfig, makeIngestUrlHandler, ingestFileToolConfig, makeIngestFileHandler, } from './tools/docs-ai.js';
|
|
84
|
+
import { attachToTicketToolConfig, makeAttachToTicketHandler } from './tools/attach.js';
|
|
85
|
+
import { setParentToolConfig, makeSetParentHandler } from './tools/set-parent.js';
|
|
86
|
+
import { applyAgentProfile } from './tools/shared.js';
|
|
87
|
+
import { updateProjectToolConfig, makeUpdateProjectHandler, createProjectToolConfig, makeCreateProjectHandler, archiveProjectToolConfig, makeArchiveProjectHandler, } from './tools/update-project.js';
|
|
88
|
+
import { checkSimilarToolConfig, makeCheckSimilarHandler } from './tools/check-similar.js';
|
|
89
|
+
import { workSessionStartToolConfig, makeWorkSessionStartHandler, workSessionFinishToolConfig, makeWorkSessionFinishHandler, workSessionsToolConfig, makeWorkSessionsHandler, workSessionClaimsAddToolConfig, makeWorkSessionClaimsAddHandler, workSessionClaimsReleaseToolConfig, makeWorkSessionClaimsReleaseHandler, workStartToolConfig, makeWorkStartHandler, workFinishToolConfig, makeWorkFinishHandler, workNextToolConfig, makeWorkNextHandler, } from './tools/work-sessions.js';
|
|
90
|
+
import { listAdminTranslationsToolConfig, makeListAdminTranslationsHandler, approveTranslationToolConfig, makeApproveTranslationHandler, revertTranslationToolConfig, makeAdminRevertTranslationHandler, } from './tools/admin-translations.js';
|
|
91
|
+
import { listAgentDriftToolConfig, makeListAgentDriftHandler, resolveAgentDriftToolConfig, makeResolveAgentDriftHandler, } from './tools/agent-drift.js';
|
|
92
|
+
/** ORB-1090 - the workspace's configurable working-rules, used as the
|
|
93
|
+
* fallback when the live fetch fails (offline / pre-1086 instance).
|
|
94
|
+
* On success these are replaced by the live assembled blocks so admin
|
|
95
|
+
* edits propagate to every new MCP connection. */
|
|
96
|
+
const FALLBACK_WORKING_RULES = [
|
|
97
|
+
'The following are BINDING operating rules, not guidelines - follow every one exactly, on every action, without being reminded; skipping, deferring, or "interpreting" them means the task is not done.',
|
|
98
|
+
'Workflow is STRICT: claim -> commit -> close, one ticket = one commit, every time (not only when reminded). Before touching code, claim an existing ticket or create one (`orboto_claim` / `orboto_create_ticket`) - never do silent, unticketed work. When the task is done make exactly ONE commit (with the ticket key in the subject), push it, then move the ticket to in_review/done with a one-line summary (`orboto_move_ticket` + `orboto_comment`). Do not leave finished work uncommitted.',
|
|
99
|
+
'When you write a git commit that touches a ticket, put the ticket key (e.g. `ORB-42`) in parentheses at the END of the subject line - `feat(auth): add token rotation (ORB-42)`. The orboto git-activity parser links the commit by that key.',
|
|
100
|
+
'Use sub-tickets for steps large enough to need their own commit / time tracking / review, and checklists for one-liners inside a single ticket\'s scope. Big features (Epic + 3+ phase tickets): create a milestone FIRST, then the Epic, then phase tickets as children on that milestone.',
|
|
101
|
+
].join(' ');
|
|
102
|
+
// Static MCP operational hints - tool/resource/prompt usage that does
|
|
103
|
+
// not change per workspace. The configurable working-rules are appended
|
|
104
|
+
// live below. ORB-1520 - assembled per toolset: the curated manifest
|
|
105
|
+
// gets the escape-hatch pointer, the full manifest keeps the
|
|
106
|
+
// get_checklists hint (that tool only exists there).
|
|
107
|
+
function staticMcpHints(toolset) {
|
|
108
|
+
// ORB-1805 - the minimal tier serves 8k/16k local models, where the
|
|
109
|
+
// instructions block competes with the user's own turn for the same
|
|
110
|
+
// few thousand tokens. Everything that is merely NICE to know
|
|
111
|
+
// (resources, prompts, checklist semantics, primer) is dropped here:
|
|
112
|
+
// `orboto_session_start` delivers the authoritative rules on the first
|
|
113
|
+
// call anyway, and `orboto_api_search` reaches the rest.
|
|
114
|
+
if (toolset === 'minimal') {
|
|
115
|
+
return [
|
|
116
|
+
'orboto is a ticket + project management system. Ticket keys look like `PROJ-123`; the first segment is the project key.',
|
|
117
|
+
'This is the MINIMAL tool manifest (12 tools) for small context windows. Every other endpoint stays reachable: find it with `orboto_api_search`, run it with `orboto_api_call`. Bigger manifests are opt-in: `?toolset=curated` / `full` (HTTP) or ORBOTO_MCP_TOOLSET (stdio).',
|
|
118
|
+
'Writes respect the caller\'s permissions - a 403 is the API refusing, not this server.',
|
|
119
|
+
].join(' ');
|
|
120
|
+
}
|
|
121
|
+
return [
|
|
122
|
+
'orboto is a ticket + project management system.',
|
|
123
|
+
'When starting on a project, call `orboto_get_project_primer(<PROJECT_KEY>)` once to load its conventions (tech stack, commands, gotchas, expected ticket language).',
|
|
124
|
+
'Use `orboto_list_projects` first to discover what the user can see.',
|
|
125
|
+
'Ticket keys look like `PROJ-123`; the first segment is the project key.',
|
|
126
|
+
'For "what am I working on?" prefer `orboto_my_tickets`; for "anything about X?" prefer `orboto_search`.',
|
|
127
|
+
toolset === 'full'
|
|
128
|
+
? 'Checklists: `orboto_get_ticket` includes them inline; use `orboto_get_checklists` when you only need the items. A linked-ticket suffix (`↪ [ACME-99]`) means the item is automatically checked/unchecked as that ticket\'s status moves.'
|
|
129
|
+
: 'Checklists: `orboto_get_ticket` includes them inline. A linked-ticket suffix (`↪ [ACME-99]`) means the item is automatically checked/unchecked as that ticket\'s status moves.',
|
|
130
|
+
toolset === 'curated'
|
|
131
|
+
? 'This is the CURATED tool manifest (the daily high-frequency set). The ENTIRE REST API stays reachable: find any other endpoint + its schema with `orboto_api_search`, then execute it with `orboto_api_call` - permissions are enforced server-side exactly as for named tools. The full named-tool manifest is opt-in: connect with `?toolset=full` (HTTP) or set ORBOTO_MCP_TOOLSET=full (stdio).'
|
|
132
|
+
: '',
|
|
133
|
+
'Resources (`orboto://rules`, `orboto://ticket/<key>`, `orboto://doc/<id>`, `orboto://project/<key>`, `orboto://search/<query>`) return read-only Markdown. The `orboto://` URI scheme stays canonical. `orboto://rules` returns the COMPLETE binding rules cap-independently (this instructions block may be truncated by the client). Prompts (`plan-sprint`, `triage-my-tickets`, `summarize-project`, `estimate-ticket`, `find-duplicates`) are one-click guided workflows.',
|
|
134
|
+
'A few natural parameter spellings (`key`, `query`, `id`, `projectId`, `milestoneId`, `comment`/`message`, `max`, `page`, ...) are silently normalised to the documented name; anything else that still doesn\'t match returns an error naming the tool\'s full parameter list and the closest valid name.',
|
|
135
|
+
'All writes respect the caller\'s project-level permissions - a 403 means the API rejected the write, not the MCP server.',
|
|
136
|
+
].filter((s) => s.length > 0).join(' ');
|
|
137
|
+
}
|
|
138
|
+
// ORB-1177 - MCP clients cap how much of the `instructions` block they
|
|
139
|
+
// inject and silently truncate the overflow (ORB-1168 saw a 5k+ string
|
|
140
|
+
// cut mid-rule). Enforce our own budget so the high-priority head (hints
|
|
141
|
+
// + non-negotiables + the orboto_session_start / orboto://rules pointers)
|
|
142
|
+
// always survives, and the workspace rules are cut at a WHOLE-LINE
|
|
143
|
+
// boundary with an explicit pointer to the cap-independent full set,
|
|
144
|
+
// rather than the client slicing mid-sentence. The complete rules are
|
|
145
|
+
// always available via orboto_session_start + the orboto://rules resource.
|
|
146
|
+
const INSTRUCTIONS_BUDGET = 4000;
|
|
147
|
+
const RULES_HEADING = 'Working rules for this workspace:\n';
|
|
148
|
+
const TRUNCATION_MARKER = '\n\n[... rules truncated to fit the client cap - read the COMPLETE rules via the orboto_session_start tool or the orboto://rules resource ...]';
|
|
149
|
+
export function assembleInstructions(head, workingRules, budget = INSTRUCTIONS_BUDGET) {
|
|
150
|
+
const full = `${head}\n\n${RULES_HEADING}${workingRules}`;
|
|
151
|
+
if (full.length <= budget)
|
|
152
|
+
return full;
|
|
153
|
+
const room = budget - head.length - RULES_HEADING.length - TRUNCATION_MARKER.length - 2; // 2 = the '\n\n' join
|
|
154
|
+
let kept = '';
|
|
155
|
+
if (room > 0) {
|
|
156
|
+
for (const line of workingRules.split('\n')) {
|
|
157
|
+
if (kept.length + line.length + 1 > room)
|
|
158
|
+
break;
|
|
159
|
+
kept += (kept ? '\n' : '') + line;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return `${head}\n\n${RULES_HEADING}${kept}${TRUNCATION_MARKER}`;
|
|
163
|
+
}
|
|
164
|
+
export async function buildOrbotoMcpServer(opts) {
|
|
165
|
+
const client = new OrbotoClient(opts);
|
|
166
|
+
// ORB-1520 - the manifest mode. Explicit option (per-connection) wins,
|
|
167
|
+
// then the process-wide env default, then `curated`.
|
|
168
|
+
const toolset = resolveToolset(opts.toolset, process.env.ORBOTO_MCP_TOOLSET);
|
|
169
|
+
// ORB-1090 - fetch the workspace's configurable working-rules at
|
|
170
|
+
// connect so admin edits propagate to every new MCP session. The
|
|
171
|
+
// instructions block is the one place every MCP client reliably sees
|
|
172
|
+
// the rules (clients don't read the repo's CLAUDE.md). Best-effort:
|
|
173
|
+
// fall back to the built-in rules if the instance predates ORB-1086
|
|
174
|
+
// or the fetch fails.
|
|
175
|
+
let workingRules = FALLBACK_WORKING_RULES;
|
|
176
|
+
// ORB-1471 - the same connect-time fetch also reports whether this
|
|
177
|
+
// workspace requires `orboto_session_start` before any other tool call
|
|
178
|
+
// (the hard gate). Default off; a fetch failure keeps it off.
|
|
179
|
+
let requireSessionStart = false;
|
|
180
|
+
try {
|
|
181
|
+
// ORB-1753 - stdio deployments can declare their profile via
|
|
182
|
+
// ORBOTO_AGENT_KIND / ORBOTO_MODEL_TIER; api-key standing profiles
|
|
183
|
+
// resolve server-side either way.
|
|
184
|
+
const connectParams = new URLSearchParams();
|
|
185
|
+
applyAgentProfile(connectParams);
|
|
186
|
+
const connectQs = connectParams.toString();
|
|
187
|
+
const res = await client.get(`/agent-instructions${connectQs ? `?${connectQs}` : ''}`);
|
|
188
|
+
if (res?.instructions?.trim())
|
|
189
|
+
workingRules = res.instructions.trim();
|
|
190
|
+
requireSessionStart = res?.requireSessionStart === true;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// keep the fallback
|
|
194
|
+
}
|
|
195
|
+
const server = new McpServer({ name: 'orboto', version: VERSION }, {
|
|
196
|
+
// ORB-940 - advertise resources/subscribe so MCP-aware clients
|
|
197
|
+
// (Claude Desktop, Cursor) wire up live updates instead of
|
|
198
|
+
// polling. Even when no bridge is hooked up (stdio sessions)
|
|
199
|
+
// the capability stays on; subscriptions just stay quiet.
|
|
200
|
+
capabilities: {
|
|
201
|
+
resources: { subscribe: true, listChanged: true },
|
|
202
|
+
},
|
|
203
|
+
// `instructions` appears in the system-prompt-style block some
|
|
204
|
+
// MCP clients inject before the user's first message. Static
|
|
205
|
+
// operational hints + the live, workspace-configurable working
|
|
206
|
+
// rules (ORB-1086).
|
|
207
|
+
//
|
|
208
|
+
// ORB-1168 - MCP clients cap how much of this block they inject; a
|
|
209
|
+
// 5k+ string was being silently truncated mid-rule, so an MCP-only
|
|
210
|
+
// agent (no skill / no repo CLAUDE.md) got incomplete rules. Put
|
|
211
|
+
// the orientation, a pointer to the full rule set (the
|
|
212
|
+
// orboto_session_start tool), and the core non-negotiables
|
|
213
|
+
// FIRST so they survive any truncation; the full workspace rules
|
|
214
|
+
// follow and only their tail is at risk.
|
|
215
|
+
// ORB-1805 - the minimal tier ships the HEAD ONLY: no workspace
|
|
216
|
+
// rules block at all. On an 8k window every rule line here is a
|
|
217
|
+
// line the user's own turn does not get, and the rules are not
|
|
218
|
+
// lost - `orboto_session_start` (which the head demands as the
|
|
219
|
+
// first action) returns the complete, authoritative set, and its
|
|
220
|
+
// length is then the caller's budget to spend, not a fixed tax on
|
|
221
|
+
// every connect. It also makes this block a CONSTANT: a workspace
|
|
222
|
+
// that grows its rules cannot grow the minimal manifest.
|
|
223
|
+
instructions: toolset === 'minimal'
|
|
224
|
+
? [
|
|
225
|
+
staticMcpHints(toolset),
|
|
226
|
+
'FIRST ACTION: call `orboto_session_start` - it returns the binding workspace rules plus your in-progress work. Re-run it after any context compaction. Non-negotiables: claim or create a ticket before touching code, one commit per ticket with the ticket key in the subject, push after each commit, never mark work done that is not done.',
|
|
227
|
+
].join('\n\n')
|
|
228
|
+
: assembleInstructions([
|
|
229
|
+
staticMcpHints(toolset),
|
|
230
|
+
'FIRST ACTION this session: call the `orboto_session_start` tool - it returns the complete, authoritative binding rules you must follow (plus your in-progress work). Re-run it after any context compaction. If the rules below look cut off, `orboto_session_start` and the `orboto://rules` resource always have the full set. (Do NOT use `orboto_list_agent_instructions` to read the rules - that manages rule blocks for admins.) Core non-negotiables: ticket-first (claim or create a ticket before touching code), one commit per ticket with the ticket key in the subject line, push after each commit, and never mark work done that is not actually done.',
|
|
231
|
+
].join('\n\n'), workingRules),
|
|
232
|
+
});
|
|
233
|
+
// ORB-1331 - one-time session-start nudge. The state object lives for
|
|
234
|
+
// the lifetime of THIS server instance: the HTTP transport builds one
|
|
235
|
+
// server per session and the stdio transport one per process, so a
|
|
236
|
+
// single flag object is per-session (HTTP) / process-local (stdio)
|
|
237
|
+
// without any session-lifecycle plumbing. Shared by reference into
|
|
238
|
+
// every tool's dispatch wrapper below.
|
|
239
|
+
const nudgeState = createNudgeState(requireSessionStart);
|
|
240
|
+
// ORB-311 - every tool dispatch posts one row to /admin/mcp/instrument
|
|
241
|
+
// via the withMetrics wrapper. `reg` is a one-line shim around
|
|
242
|
+
// `server.registerTool` that adds the metrics layer at registration
|
|
243
|
+
// time; per-tool files stay metrics-unaware.
|
|
244
|
+
// ORB-1520 - the toolset gate. Wraps the metrics-registering shim so a
|
|
245
|
+
// tail tool in curated mode simply never registers; the reg() CALL
|
|
246
|
+
// SITES below stay untouched (the chat-tools drift guard parses them
|
|
247
|
+
// from this file's source and must keep seeing the full set).
|
|
248
|
+
const regAll = registerWithMetrics(server, client, opts.userAgentSuffix, nudgeState);
|
|
249
|
+
const reg = (toolName, config, handler) => {
|
|
250
|
+
if (!toolInToolset(toolName, toolset))
|
|
251
|
+
return;
|
|
252
|
+
// ORB-1805 - the minimal tier drops the human-readable `title`
|
|
253
|
+
// (measured 580 characters across its 12 tools). `name` is already
|
|
254
|
+
// self-describing (orboto_create_ticket) and a client without a
|
|
255
|
+
// title falls back to it, so the display loss is small where the
|
|
256
|
+
// token pressure is largest. Curated/full keep their titles.
|
|
257
|
+
const cfg = toolset === 'minimal' && config && 'title' in config
|
|
258
|
+
? (() => { const { title: _title, ...rest } = config; return rest; })()
|
|
259
|
+
: config;
|
|
260
|
+
regAll(toolName, cfg, handler);
|
|
261
|
+
};
|
|
262
|
+
// Tools - alphabetical-ish by concept. Each tool file owns its
|
|
263
|
+
// input/output schema; the server just glues names to handlers.
|
|
264
|
+
reg('orboto_ai_status', aiStatusToolConfig, makeAiStatusHandler(client));
|
|
265
|
+
reg('orboto_embedding_status', embeddingStatusToolConfig, makeEmbeddingStatusHandler(client));
|
|
266
|
+
reg('orboto_ai_usage', aiUsageToolConfig, makeAiUsageHandler(client));
|
|
267
|
+
// ORB-1093 - session-start / post-compact re-orientation digest.
|
|
268
|
+
reg('orboto_session_start', sessionStartToolConfig, makeSessionStartHandler(client));
|
|
269
|
+
// ORB-1697 - the way back from a budget-truncated response. Serves the
|
|
270
|
+
// omitted remainder from the in-process store, so capping a response
|
|
271
|
+
// never loses content.
|
|
272
|
+
reg('orboto_response_expand', responseExpandToolConfig, makeResponseExpandHandler());
|
|
273
|
+
// ORB-1741 - lazy full guidance: manifest descriptions are one-line
|
|
274
|
+
// summaries (tool-docs.ts); this serves the complete text on demand.
|
|
275
|
+
reg('orboto_help', helpToolConfig, makeHelpHandler());
|
|
276
|
+
// ORB-1518 - Code-Mode escape hatch, discovery half: search the live
|
|
277
|
+
// OpenAPI spec / fetch one endpoint's schema on demand. Keeps the whole
|
|
278
|
+
// REST surface reachable without a named tool per endpoint.
|
|
279
|
+
reg('orboto_api_search', apiSearchToolConfig, makeApiSearchHandler(client));
|
|
280
|
+
// ORB-1519 - the execute half: structured REST proxy through the
|
|
281
|
+
// API's full auth + permission chain (POST /system/api-proxy).
|
|
282
|
+
reg('orboto_api_call', apiCallToolConfig, makeApiCallHandler(client));
|
|
283
|
+
// ORB-1089 - manage the configurable coding-agent rule blocks (admin:ai:write).
|
|
284
|
+
reg('orboto_list_agent_instructions', listAgentInstructionsToolConfig, makeListAgentInstructionsHandler(client));
|
|
285
|
+
reg('orboto_create_agent_instruction', createAgentInstructionToolConfig, makeCreateAgentInstructionHandler(client));
|
|
286
|
+
reg('orboto_update_agent_instruction', updateAgentInstructionToolConfig, makeUpdateAgentInstructionHandler(client));
|
|
287
|
+
reg('orboto_reset_agent_instruction', resetAgentInstructionToolConfig, makeResetAgentInstructionHandler(client));
|
|
288
|
+
reg('orboto_delete_agent_instruction', deleteAgentInstructionToolConfig, makeDeleteAgentInstructionHandler(client));
|
|
289
|
+
// ORB-705 - Multi-Agent Coordination tools (heartbeat, presence,
|
|
290
|
+
// directed notify). Layered on the ORB-704 REST surface.
|
|
291
|
+
reg('orboto_agent_heartbeat', agentHeartbeatToolConfig, makeAgentHeartbeatHandler(client));
|
|
292
|
+
reg('orboto_agent_presence', agentPresenceToolConfig, makeAgentPresenceHandler(client));
|
|
293
|
+
reg('orboto_agent_notify', agentNotifyToolConfig, makeAgentNotifyHandler(client));
|
|
294
|
+
// ORB-1727 - the receive half of the store-and-forward inbox.
|
|
295
|
+
reg('orboto_messages', agentMessagesToolConfig, makeAgentMessagesHandler(client));
|
|
296
|
+
// ORB-964 - scoped fan-out for multi-agent coordination.
|
|
297
|
+
reg('orboto_agent_broadcast', agentBroadcastToolConfig, makeAgentBroadcastHandler(client));
|
|
298
|
+
reg('orboto_list_projects', listProjectsToolConfig, makeListProjectsHandler(client));
|
|
299
|
+
reg('orboto_get_project', getProjectToolConfig, makeGetProjectHandler(client));
|
|
300
|
+
reg('orboto_get_project_primer', getProjectPrimerToolConfig, makeGetProjectPrimerHandler(client));
|
|
301
|
+
reg('orboto_list_tickets', listTicketsToolConfig, makeListTicketsHandler(client));
|
|
302
|
+
reg('orboto_critical_path', criticalPathToolConfig, makeCriticalPathHandler(client));
|
|
303
|
+
reg('orboto_analytics', analyticsToolConfig, makeAnalyticsHandler(client));
|
|
304
|
+
reg('orboto_portfolio_summary', portfolioSummaryToolConfig, makePortfolioSummaryHandler(client));
|
|
305
|
+
reg('orboto_get_ticket', getTicketToolConfig, makeGetTicketHandler(client));
|
|
306
|
+
reg('orboto_get_checklists', getChecklistsToolConfig, makeGetChecklistsHandler(client));
|
|
307
|
+
reg('orboto_my_tickets', myTicketsToolConfig, makeMyTicketsHandler(client));
|
|
308
|
+
reg('orboto_list_milestones', listMilestonesToolConfig, makeListMilestonesHandler(client));
|
|
309
|
+
reg('orboto_get_milestone', getMilestoneToolConfig, makeGetMilestoneHandler(client));
|
|
310
|
+
reg('orboto_search', searchToolConfig, makeSearchHandler(client));
|
|
311
|
+
reg('orboto_query', queryToolConfig, makeQueryHandler(client));
|
|
312
|
+
reg('orboto_customer_report', customerReportToolConfig, makeCustomerReportHandler(client));
|
|
313
|
+
reg('orboto_requirements_spec', requirementsSpecToolConfig, makeRequirementsSpecHandler(client));
|
|
314
|
+
reg('orboto_list_doc_spaces', listDocSpacesToolConfig, makeListDocSpacesHandler(client));
|
|
315
|
+
reg('orboto_get_doc', getDocToolConfig, makeGetDocHandler(client));
|
|
316
|
+
// ORB-1342 (epic ORB-1339) - context-efficient doc snippet search +
|
|
317
|
+
// targeted edits. Wrap GET /docs/search (ORB-1340) and POST
|
|
318
|
+
// /docs/:id/edits (ORB-1341). Prefer these over get_doc + update_doc for
|
|
319
|
+
// small changes to a large doc: find a passage by snippet, change it by
|
|
320
|
+
// diff, never transfer the full body in either direction.
|
|
321
|
+
reg('orboto_search_docs', searchDocsToolConfig, makeSearchDocsHandler(client));
|
|
322
|
+
reg('orboto_edit_doc', editDocToolConfig, makeEditDocHandler(client));
|
|
323
|
+
reg('orboto_edit_doc_section', editDocSectionToolConfig, makeEditDocSectionHandler(client));
|
|
324
|
+
// ORB-912 - doc-spaces CRUD + list docs in a space. Closes the
|
|
325
|
+
// first slice of the MCP doc-surface parity gap (epic ORB-911).
|
|
326
|
+
reg('orboto_create_doc_space', createDocSpaceToolConfig, makeCreateDocSpaceHandler(client));
|
|
327
|
+
reg('orboto_update_doc_space', updateDocSpaceToolConfig, makeUpdateDocSpaceHandler(client));
|
|
328
|
+
reg('orboto_delete_doc_space', deleteDocSpaceToolConfig, makeDeleteDocSpaceHandler(client));
|
|
329
|
+
reg('orboto_list_docs_in_space', listDocsInSpaceToolConfig, makeListDocsInSpaceHandler(client));
|
|
330
|
+
// ORB-913 - doc-page CRUD (plain create + update + delete + move).
|
|
331
|
+
reg('orboto_create_doc', createDocToolConfig, makeCreateDocHandler(client));
|
|
332
|
+
reg('orboto_update_doc', updateDocToolConfig, makeUpdateDocHandler(client));
|
|
333
|
+
reg('orboto_delete_doc', deleteDocToolConfig, makeDeleteDocHandler(client));
|
|
334
|
+
reg('orboto_move_doc', moveDocToolConfig, makeMoveDocHandler(client));
|
|
335
|
+
// ORB-914 - doc-attachments (upload + list + delete).
|
|
336
|
+
reg('orboto_upload_doc_attachment', uploadDocAttachmentToolConfig, makeUploadDocAttachmentHandler(client));
|
|
337
|
+
reg('orboto_list_doc_attachments', listDocAttachmentsToolConfig, makeListDocAttachmentsHandler(client));
|
|
338
|
+
reg('orboto_delete_doc_attachment', deleteDocAttachmentToolConfig, makeDeleteDocAttachmentHandler(client));
|
|
339
|
+
// ORB-1455 - ticket-attachment read + view (list metadata, fetch bytes /
|
|
340
|
+
// image content block). Complements orboto_attach_to_ticket (write-only).
|
|
341
|
+
reg('orboto_list_ticket_attachments', listTicketAttachmentsToolConfig, makeListTicketAttachmentsHandler(client));
|
|
342
|
+
reg('orboto_get_attachment', getAttachmentToolConfig, makeGetAttachmentHandler(client));
|
|
343
|
+
// ORB-915 - doc export (Markdown + PDF).
|
|
344
|
+
reg('orboto_export_doc_md', exportDocMdToolConfig, makeExportDocMdHandler(client));
|
|
345
|
+
reg('orboto_export_doc_pdf', exportDocPdfToolConfig, makeExportDocPdfHandler(client));
|
|
346
|
+
// ORB-916 - doc revision history (list + get + restore). Closes
|
|
347
|
+
// the last slice of the doc-surface parity gap (epic ORB-911).
|
|
348
|
+
reg('orboto_list_doc_revisions', listDocRevisionsToolConfig, makeListDocRevisionsHandler(client));
|
|
349
|
+
reg('orboto_get_doc_revision', getDocRevisionToolConfig, makeGetDocRevisionHandler(client));
|
|
350
|
+
reg('orboto_restore_doc_revision', restoreDocRevisionToolConfig, makeRestoreDocRevisionHandler(client));
|
|
351
|
+
// ORB-917 - doc comments (list + post + resolve + delete).
|
|
352
|
+
reg('orboto_list_doc_comments', listDocCommentsToolConfig, makeListDocCommentsHandler(client));
|
|
353
|
+
reg('orboto_post_doc_comment', postDocCommentToolConfig, makePostDocCommentHandler(client));
|
|
354
|
+
reg('orboto_resolve_doc_comment', resolveDocCommentToolConfig, makeResolveDocCommentHandler(client));
|
|
355
|
+
reg('orboto_update_doc_comment', updateDocCommentToolConfig, makeUpdateDocCommentHandler(client));
|
|
356
|
+
reg('orboto_delete_doc_comment', deleteDocCommentToolConfig, makeDeleteDocCommentHandler(client));
|
|
357
|
+
reg('orboto_update_public_holiday', updatePublicHolidayToolConfig, makeUpdatePublicHolidayHandler(client));
|
|
358
|
+
reg('orboto_update_company_closure', updateCompanyClosureToolConfig, makeUpdateCompanyClosureHandler(client));
|
|
359
|
+
reg('orboto_update_absence', updateAbsenceToolConfig, makeUpdateAbsenceHandler(client));
|
|
360
|
+
reg('orboto_list_cross_project_links', listCrossProjectLinksToolConfig, makeListCrossProjectLinksHandler(client));
|
|
361
|
+
reg('orboto_add_cross_project_link', addCrossProjectLinkToolConfig, makeAddCrossProjectLinkHandler(client));
|
|
362
|
+
reg('orboto_update_cross_project_link', updateCrossProjectLinkToolConfig, makeUpdateCrossProjectLinkHandler(client));
|
|
363
|
+
reg('orboto_remove_cross_project_link', removeCrossProjectLinkToolConfig, makeRemoveCrossProjectLinkHandler(client));
|
|
364
|
+
// ORB-918 - duplicate-space + resolve-links. Closes the doc-surface
|
|
365
|
+
// parity epic (ORB-911) - every doc-API endpoint now has an MCP
|
|
366
|
+
// pendant.
|
|
367
|
+
reg('orboto_duplicate_doc_space', duplicateDocSpaceToolConfig, makeDuplicateDocSpaceHandler(client));
|
|
368
|
+
reg('orboto_resolve_doc_smart_links', resolveDocSmartLinksToolConfig, makeResolveDocSmartLinksHandler(client));
|
|
369
|
+
// ORB-855 - LLM-Wiki tools (ingest / ask / lint / plan-apply / record /
|
|
370
|
+
// append-section / flag-stale). Thin wrappers over the Phase B/C/D routes.
|
|
371
|
+
reg('orboto_wiki_ingest_url', wikiIngestUrlToolConfig, makeWikiIngestUrlHandler(client));
|
|
372
|
+
reg('orboto_wiki_ask', wikiAskToolConfig, makeWikiAskHandler(client));
|
|
373
|
+
reg('orboto_wiki_lint', wikiLintToolConfig, makeWikiLintHandler(client));
|
|
374
|
+
reg('orboto_wiki_plan_update', wikiPlanUpdateToolConfig, makeWikiPlanUpdateHandler(client));
|
|
375
|
+
reg('orboto_wiki_apply_plan', wikiApplyPlanToolConfig, makeWikiApplyPlanHandler(client));
|
|
376
|
+
reg('orboto_wiki_record', wikiRecordToolConfig, makeWikiRecordHandler(client));
|
|
377
|
+
reg('orboto_wiki_append_section', wikiAppendSectionToolConfig, makeWikiAppendSectionHandler(client));
|
|
378
|
+
reg('orboto_wiki_flag_stale', wikiFlagStaleToolConfig, makeWikiFlagStaleHandler(client));
|
|
379
|
+
reg('orboto_wiki_save_answer', wikiSaveAnswerToolConfig, makeWikiSaveAnswerHandler(client));
|
|
380
|
+
// ORB-862 - personal AI-preference facts (owner-scoped).
|
|
381
|
+
reg('orboto_personal_fact_list', personalFactListToolConfig, makePersonalFactListHandler(client));
|
|
382
|
+
reg('orboto_personal_fact_add', personalFactAddToolConfig, makePersonalFactAddHandler(client));
|
|
383
|
+
reg('orboto_personal_fact_update', personalFactUpdateToolConfig, makePersonalFactUpdateHandler(client));
|
|
384
|
+
reg('orboto_personal_fact_delete', personalFactDeleteToolConfig, makePersonalFactDeleteHandler(client));
|
|
385
|
+
reg('orboto_get_timer', getTimerToolConfig, makeGetTimerHandler(client));
|
|
386
|
+
reg('orboto_list_git_app_installations', listGitAppInstallationsToolConfig, makeListGitAppInstallationsHandler(client));
|
|
387
|
+
// ORB-309 Phase C - write tools (Group 1: ticket mutations).
|
|
388
|
+
// Each respects the API's PBAC cascade - a 403 surfaces as
|
|
389
|
+
// OrbotoApiError → MCP throws → client sees an isError response.
|
|
390
|
+
reg('orboto_create_ticket', createTicketToolConfig, makeCreateTicketHandler(client));
|
|
391
|
+
reg('orboto_update_ticket', updateTicketToolConfig, makeUpdateTicketHandler(client));
|
|
392
|
+
reg('orboto_move_ticket', moveTicketToolConfig, makeMoveTicketHandler(client));
|
|
393
|
+
reg('orboto_close_ticket', closeTicketToolConfig, makeCloseTicketHandler(client));
|
|
394
|
+
reg('orboto_delete_ticket', deleteTicketToolConfig, makeDeleteTicketHandler(client));
|
|
395
|
+
reg('orboto_comment', commentToolConfig, makeCommentHandler(client));
|
|
396
|
+
reg('orboto_update_comment', updateCommentToolConfig, makeUpdateCommentHandler(client));
|
|
397
|
+
reg('orboto_delete_comment', deleteCommentToolConfig, makeDeleteCommentHandler(client));
|
|
398
|
+
reg('orboto_assign', assignToolConfig, makeAssignHandler(client));
|
|
399
|
+
reg('orboto_unassign', unassignToolConfig, makeUnassignHandler(client));
|
|
400
|
+
reg('orboto_label_ticket', labelTicketToolConfig, makeLabelTicketHandler(client));
|
|
401
|
+
reg('orboto_unlabel_ticket', unlabelTicketToolConfig, makeUnlabelTicketHandler(client));
|
|
402
|
+
reg('orboto_set_milestone', setMilestoneToolConfig, makeSetMilestoneHandler(client));
|
|
403
|
+
// ORB-1037 - RACI agent surfaces: read the matrix + set a person's role.
|
|
404
|
+
reg('orboto_raci', raciToolConfig, makeRaciHandler(client));
|
|
405
|
+
reg('orboto_set_raci', setRaciToolConfig, makeSetRaciHandler(client));
|
|
406
|
+
// ORB-453 - ticket-dependency tools (3-way-sync gap filed after the
|
|
407
|
+
// skill wrapper landed in ORB-452). Same idempotent-on-409/404
|
|
408
|
+
// semantics as orboto_assign / orboto_unassign.
|
|
409
|
+
reg('orboto_add_ticket_dependency', addTicketDependencyToolConfig, makeAddTicketDependencyHandler(client));
|
|
410
|
+
reg('orboto_remove_ticket_dependency', removeTicketDependencyToolConfig, makeRemoveTicketDependencyHandler(client));
|
|
411
|
+
reg('orboto_list_ticket_dependencies', listTicketDependenciesToolConfig, makeListTicketDependenciesHandler(client));
|
|
412
|
+
// ORB-309 Phase C - Group 2: time tools.
|
|
413
|
+
reg('orboto_timer_start', timerStartToolConfig, makeTimerStartHandler(client));
|
|
414
|
+
reg('orboto_timer_stop', timerStopToolConfig, makeTimerStopHandler(client));
|
|
415
|
+
reg('orboto_log_time', logTimeToolConfig, makeLogTimeHandler(client));
|
|
416
|
+
reg('orboto_list_time_entries', listTimeEntriesToolConfig, makeListTimeEntriesHandler(client));
|
|
417
|
+
reg('orboto_edit_time_entry', editTimeEntryToolConfig, makeEditTimeEntryHandler(client));
|
|
418
|
+
reg('orboto_delete_time_entry', deleteTimeEntryToolConfig, makeDeleteTimeEntryHandler(client));
|
|
419
|
+
// ORB-626 - ticket meeting schedules (working sessions + iCal invites).
|
|
420
|
+
reg('orboto_list_ticket_schedules', listTicketSchedulesToolConfig, makeListTicketSchedulesHandler(client));
|
|
421
|
+
reg('orboto_schedule_ticket_session', scheduleTicketSessionToolConfig, makeScheduleTicketSessionHandler(client));
|
|
422
|
+
reg('orboto_cancel_ticket_session', cancelTicketSessionToolConfig, makeCancelTicketSessionHandler(client));
|
|
423
|
+
// ORB-309 Phase C - Group 3: checklist writes (ORB-234 surface).
|
|
424
|
+
reg('orboto_check', checkToolConfig, makeCheckHandler(client));
|
|
425
|
+
reg('orboto_uncheck', uncheckToolConfig, makeUncheckHandler(client));
|
|
426
|
+
reg('orboto_add_check', addCheckToolConfig, makeAddCheckHandler(client));
|
|
427
|
+
reg('orboto_remove_check', removeCheckToolConfig, makeRemoveCheckHandler(client));
|
|
428
|
+
reg('orboto_new_checklist', newChecklistToolConfig, makeNewChecklistHandler(client));
|
|
429
|
+
// ORB-309 Phase C - Group 4: admin-only tools. Each call hits a
|
|
430
|
+
// route gated on super-admin / admin:* permissions; a non-admin
|
|
431
|
+
// caller's 403 surfaces as a readable error from rewrite403().
|
|
432
|
+
reg('orboto_list_users', listUsersToolConfig, makeListUsersHandler(client));
|
|
433
|
+
// ORB-625 - free/busy availability lookup for assignee selection (read).
|
|
434
|
+
reg('orboto_free_busy', freeBusyToolConfig, makeFreeBusyHandler(client));
|
|
435
|
+
reg('orboto_get_audit_log', getAuditLogToolConfig, makeGetAuditLogHandler(client));
|
|
436
|
+
reg('orboto_trigger_backup', triggerBackupToolConfig, makeTriggerBackupHandler(client));
|
|
437
|
+
reg('orboto_create_full_backup', createFullBackupToolConfig, makeCreateFullBackupHandler(client));
|
|
438
|
+
reg('orboto_list_backups', listBackupsToolConfig, makeListBackupsHandler(client));
|
|
439
|
+
reg('orboto_download_backup', downloadBackupToolConfig, makeDownloadBackupHandler(client));
|
|
440
|
+
// ORB-510 / ORB-513 - primer-fact tools. Wraps the ORB-511 REST
|
|
441
|
+
// surface so agents can record structured project facts that the
|
|
442
|
+
// primer renderer (ORB-512) surfaces at session start. The skill
|
|
443
|
+
// rule (ORB-514) tells agents *when* to record; these are the *how*.
|
|
444
|
+
reg('orboto_primer_fact_list', primerFactListToolConfig, makePrimerFactListHandler(client));
|
|
445
|
+
reg('orboto_primer_fact_add', primerFactAddToolConfig, makePrimerFactAddHandler(client));
|
|
446
|
+
reg('orboto_primer_fact_update', primerFactUpdateToolConfig, makePrimerFactUpdateHandler(client));
|
|
447
|
+
reg('orboto_primer_fact_supersede', primerFactSupersedeToolConfig, makePrimerFactSupersedeHandler(client));
|
|
448
|
+
reg('orboto_primer_fact_verify', primerFactVerifyToolConfig, makePrimerFactVerifyHandler(client));
|
|
449
|
+
reg('orboto_primer_fact_delete', primerFactDeleteToolConfig, makePrimerFactDeleteHandler(client));
|
|
450
|
+
// ORB-799 - wrapper-feature-parity gap-close. Eight clusters:
|
|
451
|
+
// 1. Identity (whoami)
|
|
452
|
+
// 2. Composite (claim, unclaim)
|
|
453
|
+
// 3. Milestone CRUD (create, close, update)
|
|
454
|
+
// 4. Project listings (statuses, labels)
|
|
455
|
+
// 5. Bulk writes (patch, move, close, comment, assign, unassign)
|
|
456
|
+
// 6. Docs-AI (ask, ingest-url, ingest-file)
|
|
457
|
+
// 7. Attachments (attach-to-ticket)
|
|
458
|
+
// 8. Re-parenting (set-parent - symmetric to set_milestone)
|
|
459
|
+
reg('orboto_whoami', whoamiToolConfig, makeWhoamiHandler(client));
|
|
460
|
+
reg('orboto_claim', claimToolConfig, makeClaimHandler(client));
|
|
461
|
+
reg('orboto_unclaim', unclaimToolConfig, makeUnclaimHandler(client));
|
|
462
|
+
// ORB-1223 - approval / sign-off gates.
|
|
463
|
+
reg('orboto_list_approvals', listApprovalsToolConfig, makeListApprovalsHandler(client));
|
|
464
|
+
reg('orboto_approval_decide', approvalDecideToolConfig, makeApprovalDecideHandler(client));
|
|
465
|
+
// ORB-1615 - structural review policy: fingerprint, consult-before-invoking
|
|
466
|
+
// policy check, and recording a review decision. Rule CONFIGURATION stays
|
|
467
|
+
// out of MCP (project-settings admin, same as approval-policy CRUD above).
|
|
468
|
+
reg('orboto_review_fingerprint', reviewFingerprintToolConfig, makeReviewFingerprintHandler(client));
|
|
469
|
+
reg('orboto_review_policy_check', reviewPolicyCheckToolConfig, makeReviewPolicyCheckHandler(client));
|
|
470
|
+
reg('orboto_review_approval_record', reviewApprovalRecordToolConfig, makeReviewApprovalRecordHandler(client));
|
|
471
|
+
reg('orboto_create_milestone', createMilestoneToolConfig, makeCreateMilestoneHandler(client));
|
|
472
|
+
reg('orboto_close_milestone', closeMilestoneToolConfig, makeCloseMilestoneHandler(client));
|
|
473
|
+
reg('orboto_update_milestone', updateMilestoneToolConfig, makeUpdateMilestoneHandler(client));
|
|
474
|
+
reg('orboto_list_ticket_statuses', listTicketStatusesToolConfig, makeListTicketStatusesHandler(client));
|
|
475
|
+
reg('orboto_list_labels', listLabelsToolConfig, makeListLabelsHandler(client));
|
|
476
|
+
reg('orboto_create_label', createLabelToolConfig, makeCreateLabelHandler(client));
|
|
477
|
+
reg('orboto_bulk_patch_tickets', bulkPatchTicketsToolConfig, makeBulkPatchTicketsHandler(client));
|
|
478
|
+
reg('orboto_bulk_move_tickets', bulkMoveTicketsToolConfig, makeBulkMoveTicketsHandler(client));
|
|
479
|
+
reg('orboto_bulk_close_tickets', bulkCloseTicketsToolConfig, makeBulkCloseTicketsHandler(client));
|
|
480
|
+
// ORB-1694 - the two longest measured consecutive-call runs (create 49x,
|
|
481
|
+
// add_dependency 27x) collapse into one call each.
|
|
482
|
+
reg('orboto_bulk_create_tickets', bulkCreateTicketsToolConfig, makeBulkCreateTicketsHandler(client));
|
|
483
|
+
reg('orboto_bulk_add_ticket_dependencies', bulkAddTicketDependenciesToolConfig, makeBulkAddTicketDependenciesHandler(client));
|
|
484
|
+
reg('orboto_bulk_comment_tickets', bulkCommentTicketsToolConfig, makeBulkCommentTicketsHandler(client));
|
|
485
|
+
reg('orboto_bulk_assign_tickets', bulkAssignTicketsToolConfig, makeBulkAssignTicketsHandler(client));
|
|
486
|
+
reg('orboto_bulk_unassign_tickets', bulkUnassignTicketsToolConfig, makeBulkUnassignTicketsHandler(client));
|
|
487
|
+
reg('orboto_ask_docs', askDocsToolConfig, makeAskDocsHandler(client));
|
|
488
|
+
reg('orboto_ingest_url', ingestUrlToolConfig, makeIngestUrlHandler(client));
|
|
489
|
+
reg('orboto_ingest_file', ingestFileToolConfig, makeIngestFileHandler(client));
|
|
490
|
+
reg('orboto_attach_to_ticket', attachToTicketToolConfig, makeAttachToTicketHandler(client));
|
|
491
|
+
reg('orboto_set_parent', setParentToolConfig, makeSetParentHandler(client));
|
|
492
|
+
reg('orboto_update_project', updateProjectToolConfig, makeUpdateProjectHandler(client));
|
|
493
|
+
reg('orboto_create_project', createProjectToolConfig, makeCreateProjectHandler(client));
|
|
494
|
+
reg('orboto_archive_project', archiveProjectToolConfig, makeArchiveProjectHandler(client));
|
|
495
|
+
reg('orboto_check_similar', checkSimilarToolConfig, makeCheckSimilarHandler(client));
|
|
496
|
+
// ORB-1609 - work sessions: the lease/timer/presence/evidence record.
|
|
497
|
+
reg('orboto_work_session_start', workSessionStartToolConfig, makeWorkSessionStartHandler(client));
|
|
498
|
+
// ORB-1611 - the one-call bundled pickup: acquire + full context bundle.
|
|
499
|
+
reg('orboto_work_start', workStartToolConfig, makeWorkStartHandler(client));
|
|
500
|
+
reg('orboto_work_session_finish', workSessionFinishToolConfig, makeWorkSessionFinishHandler(client));
|
|
501
|
+
// ORB-1612 - the one-call bundled exit: finish + ticket transition + note.
|
|
502
|
+
reg('orboto_work_finish', workFinishToolConfig, makeWorkFinishHandler(client));
|
|
503
|
+
// ORB-1613 - collision-aware dispatch pull for worker pools.
|
|
504
|
+
reg('orboto_work_next', workNextToolConfig, makeWorkNextHandler(client));
|
|
505
|
+
reg('orboto_work_sessions', workSessionsToolConfig, makeWorkSessionsHandler(client));
|
|
506
|
+
// ORB-1610 - resource claims: path globs + named exclusive resources.
|
|
507
|
+
reg('orboto_work_session_claims_add', workSessionClaimsAddToolConfig, makeWorkSessionClaimsAddHandler(client));
|
|
508
|
+
reg('orboto_work_session_claims_release', workSessionClaimsReleaseToolConfig, makeWorkSessionClaimsReleaseHandler(client));
|
|
509
|
+
reg('orboto_admin_translation_list', listAdminTranslationsToolConfig, makeListAdminTranslationsHandler(client));
|
|
510
|
+
reg('orboto_admin_translation_approve', approveTranslationToolConfig, makeApproveTranslationHandler(client));
|
|
511
|
+
reg('orboto_admin_translation_revert', revertTranslationToolConfig, makeAdminRevertTranslationHandler(client));
|
|
512
|
+
reg('orboto_admin_agent_drift_list', listAgentDriftToolConfig, makeListAgentDriftHandler(client));
|
|
513
|
+
reg('orboto_admin_agent_drift_resolve', resolveAgentDriftToolConfig, makeResolveAgentDriftHandler(client));
|
|
514
|
+
// ORB-310 Phase D - read-only `orboto://…` URI resources +
|
|
515
|
+
// task-shaped Prompt templates the MCP client offers in its UI.
|
|
516
|
+
registerOrbotoResources(server, client);
|
|
517
|
+
registerOrbotoPrompts(server);
|
|
518
|
+
// ORB-940 - resources/subscribe + resources/unsubscribe. The Set
|
|
519
|
+
// is shared by reference with the transport's event-bridge, which
|
|
520
|
+
// is the actual sender of `notifications/resources/updated`. We
|
|
521
|
+
// resolve immediately with an empty result either way - the spec
|
|
522
|
+
// allows that, and the bridge does the real work.
|
|
523
|
+
if (opts.subscriptions) {
|
|
524
|
+
const subs = opts.subscriptions;
|
|
525
|
+
server.server.setRequestHandler(SubscribeRequestSchema, async (req) => {
|
|
526
|
+
subs.add(req.params.uri);
|
|
527
|
+
// ORB-940 follow-up - stderr-log every subscribe/unsubscribe so
|
|
528
|
+
// operators can see in the MCP container log whether the AI
|
|
529
|
+
// client actually opts into live updates (vs. just reading the
|
|
530
|
+
// resource once). Diagnostic only - never throw from here.
|
|
531
|
+
try {
|
|
532
|
+
process.stderr.write(`[orboto-mcp] subscribe → ${req.params.uri} (total subs: ${subs.size})\n`);
|
|
533
|
+
}
|
|
534
|
+
catch { /* ignore */ }
|
|
535
|
+
return {};
|
|
536
|
+
});
|
|
537
|
+
server.server.setRequestHandler(UnsubscribeRequestSchema, async (req) => {
|
|
538
|
+
subs.delete(req.params.uri);
|
|
539
|
+
try {
|
|
540
|
+
process.stderr.write(`[orboto-mcp] unsubscribe → ${req.params.uri} (remaining: ${subs.size})\n`);
|
|
541
|
+
}
|
|
542
|
+
catch { /* ignore */ }
|
|
543
|
+
return {};
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
return server;
|
|
547
|
+
}
|