mcp-codex-worker 0.1.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.
Files changed (462) hide show
  1. package/README.md +135 -0
  2. package/bin/mcp-codex-worker.mjs +17 -0
  3. package/dist/src/app.d.ts +29 -0
  4. package/dist/src/app.js +353 -0
  5. package/dist/src/app.js.map +1 -0
  6. package/dist/src/config/defaults.d.ts +11 -0
  7. package/dist/src/config/defaults.js +12 -0
  8. package/dist/src/config/defaults.js.map +1 -0
  9. package/dist/src/index.d.ts +2 -0
  10. package/dist/src/index.js +64 -0
  11. package/dist/src/index.js.map +1 -0
  12. package/dist/src/mcp/tool-definitions.d.ts +180 -0
  13. package/dist/src/mcp/tool-definitions.js +241 -0
  14. package/dist/src/mcp/tool-definitions.js.map +1 -0
  15. package/dist/src/services/app-server-client.d.ts +65 -0
  16. package/dist/src/services/app-server-client.js +511 -0
  17. package/dist/src/services/app-server-client.js.map +1 -0
  18. package/dist/src/services/codex-runtime.d.ts +84 -0
  19. package/dist/src/services/codex-runtime.js +371 -0
  20. package/dist/src/services/codex-runtime.js.map +1 -0
  21. package/dist/src/services/fleet-mode.d.ts +3 -0
  22. package/dist/src/services/fleet-mode.js +21 -0
  23. package/dist/src/services/fleet-mode.js.map +1 -0
  24. package/dist/src/services/model-catalog.d.ts +22 -0
  25. package/dist/src/services/model-catalog.js +51 -0
  26. package/dist/src/services/model-catalog.js.map +1 -0
  27. package/dist/src/services/profile-manager.d.ts +29 -0
  28. package/dist/src/services/profile-manager.js +82 -0
  29. package/dist/src/services/profile-manager.js.map +1 -0
  30. package/dist/src/types/codex.d.ts +50 -0
  31. package/dist/src/types/codex.js +2 -0
  32. package/dist/src/types/codex.js.map +1 -0
  33. package/package.json +53 -0
  34. package/src/app.ts +417 -0
  35. package/src/config/defaults.ts +14 -0
  36. package/src/index.ts +84 -0
  37. package/src/mcp/tool-definitions.ts +280 -0
  38. package/src/protocol/AbsolutePathBuf.ts +14 -0
  39. package/src/protocol/AgentPath.ts +5 -0
  40. package/src/protocol/ApplyPatchApprovalParams.ts +21 -0
  41. package/src/protocol/ApplyPatchApprovalResponse.ts +6 -0
  42. package/src/protocol/AuthMode.ts +8 -0
  43. package/src/protocol/ClientInfo.ts +5 -0
  44. package/src/protocol/ClientNotification.ts +5 -0
  45. package/src/protocol/ClientRequest.ts +67 -0
  46. package/src/protocol/CollaborationMode.ts +10 -0
  47. package/src/protocol/ContentItem.ts +5 -0
  48. package/src/protocol/ConversationGitInfo.ts +5 -0
  49. package/src/protocol/ConversationSummary.ts +8 -0
  50. package/src/protocol/ExecCommandApprovalParams.ts +16 -0
  51. package/src/protocol/ExecCommandApprovalResponse.ts +6 -0
  52. package/src/protocol/ExecPolicyAmendment.ts +12 -0
  53. package/src/protocol/FileChange.ts +5 -0
  54. package/src/protocol/ForcedLoginMethod.ts +5 -0
  55. package/src/protocol/FunctionCallOutputBody.ts +6 -0
  56. package/src/protocol/FunctionCallOutputContentItem.ts +10 -0
  57. package/src/protocol/FuzzyFileSearchMatchType.ts +5 -0
  58. package/src/protocol/FuzzyFileSearchParams.ts +5 -0
  59. package/src/protocol/FuzzyFileSearchResponse.ts +6 -0
  60. package/src/protocol/FuzzyFileSearchResult.ts +9 -0
  61. package/src/protocol/FuzzyFileSearchSessionCompletedNotification.ts +5 -0
  62. package/src/protocol/FuzzyFileSearchSessionUpdatedNotification.ts +6 -0
  63. package/src/protocol/GetAuthStatusParams.ts +5 -0
  64. package/src/protocol/GetAuthStatusResponse.ts +6 -0
  65. package/src/protocol/GetConversationSummaryParams.ts +6 -0
  66. package/src/protocol/GetConversationSummaryResponse.ts +6 -0
  67. package/src/protocol/GhostCommit.ts +8 -0
  68. package/src/protocol/GitDiffToRemoteParams.ts +5 -0
  69. package/src/protocol/GitDiffToRemoteResponse.ts +6 -0
  70. package/src/protocol/GitSha.ts +5 -0
  71. package/src/protocol/ImageDetail.ts +5 -0
  72. package/src/protocol/InitializeCapabilities.ts +17 -0
  73. package/src/protocol/InitializeParams.ts +7 -0
  74. package/src/protocol/InitializeResponse.ts +20 -0
  75. package/src/protocol/InputModality.ts +8 -0
  76. package/src/protocol/LocalShellAction.ts +6 -0
  77. package/src/protocol/LocalShellExecAction.ts +5 -0
  78. package/src/protocol/LocalShellStatus.ts +5 -0
  79. package/src/protocol/MessagePhase.ts +11 -0
  80. package/src/protocol/ModeKind.ts +8 -0
  81. package/src/protocol/NetworkPolicyAmendment.ts +6 -0
  82. package/src/protocol/NetworkPolicyRuleAction.ts +5 -0
  83. package/src/protocol/ParsedCommand.ts +12 -0
  84. package/src/protocol/Personality.ts +5 -0
  85. package/src/protocol/PlanType.ts +5 -0
  86. package/src/protocol/RealtimeConversationVersion.ts +5 -0
  87. package/src/protocol/ReasoningEffort.ts +8 -0
  88. package/src/protocol/ReasoningItemContent.ts +5 -0
  89. package/src/protocol/ReasoningItemReasoningSummary.ts +5 -0
  90. package/src/protocol/ReasoningSummary.ts +10 -0
  91. package/src/protocol/RequestId.ts +5 -0
  92. package/src/protocol/Resource.ts +9 -0
  93. package/src/protocol/ResourceTemplate.ts +9 -0
  94. package/src/protocol/ResponseItem.ts +18 -0
  95. package/src/protocol/ReviewDecision.ts +10 -0
  96. package/src/protocol/ServerNotification.ts +60 -0
  97. package/src/protocol/ServerRequest.ts +18 -0
  98. package/src/protocol/ServiceTier.ts +5 -0
  99. package/src/protocol/SessionSource.ts +6 -0
  100. package/src/protocol/Settings.ts +9 -0
  101. package/src/protocol/SubAgentSource.ts +7 -0
  102. package/src/protocol/ThreadId.ts +5 -0
  103. package/src/protocol/Tool.ts +9 -0
  104. package/src/protocol/Verbosity.ts +9 -0
  105. package/src/protocol/WebSearchAction.ts +5 -0
  106. package/src/protocol/WebSearchContextSize.ts +5 -0
  107. package/src/protocol/WebSearchLocation.ts +5 -0
  108. package/src/protocol/WebSearchMode.ts +5 -0
  109. package/src/protocol/WebSearchToolConfig.ts +7 -0
  110. package/src/protocol/index.ts +75 -0
  111. package/src/protocol/serde_json/JsonValue.ts +5 -0
  112. package/src/protocol/v2/Account.ts +6 -0
  113. package/src/protocol/v2/AccountLoginCompletedNotification.ts +5 -0
  114. package/src/protocol/v2/AccountRateLimitsUpdatedNotification.ts +6 -0
  115. package/src/protocol/v2/AccountUpdatedNotification.ts +7 -0
  116. package/src/protocol/v2/AdditionalFileSystemPermissions.ts +6 -0
  117. package/src/protocol/v2/AdditionalNetworkPermissions.ts +5 -0
  118. package/src/protocol/v2/AdditionalPermissionProfile.ts +7 -0
  119. package/src/protocol/v2/AgentMessageDeltaNotification.ts +5 -0
  120. package/src/protocol/v2/AnalyticsConfig.ts +6 -0
  121. package/src/protocol/v2/AppBranding.ts +8 -0
  122. package/src/protocol/v2/AppInfo.ts +19 -0
  123. package/src/protocol/v2/AppListUpdatedNotification.ts +9 -0
  124. package/src/protocol/v2/AppMetadata.ts +7 -0
  125. package/src/protocol/v2/AppReview.ts +5 -0
  126. package/src/protocol/v2/AppScreenshot.ts +5 -0
  127. package/src/protocol/v2/AppSummary.ts +8 -0
  128. package/src/protocol/v2/AppToolApproval.ts +5 -0
  129. package/src/protocol/v2/AppToolsConfig.ts +6 -0
  130. package/src/protocol/v2/ApprovalsReviewer.ts +12 -0
  131. package/src/protocol/v2/AppsConfig.ts +8 -0
  132. package/src/protocol/v2/AppsDefaultConfig.ts +5 -0
  133. package/src/protocol/v2/AppsListParams.ts +24 -0
  134. package/src/protocol/v2/AppsListResponse.ts +14 -0
  135. package/src/protocol/v2/AskForApproval.ts +5 -0
  136. package/src/protocol/v2/ByteRange.ts +5 -0
  137. package/src/protocol/v2/CancelLoginAccountParams.ts +5 -0
  138. package/src/protocol/v2/CancelLoginAccountResponse.ts +6 -0
  139. package/src/protocol/v2/CancelLoginAccountStatus.ts +5 -0
  140. package/src/protocol/v2/ChatgptAuthTokensRefreshParams.ts +16 -0
  141. package/src/protocol/v2/ChatgptAuthTokensRefreshReason.ts +5 -0
  142. package/src/protocol/v2/ChatgptAuthTokensRefreshResponse.ts +5 -0
  143. package/src/protocol/v2/CodexErrorInfo.ts +12 -0
  144. package/src/protocol/v2/CollabAgentState.ts +6 -0
  145. package/src/protocol/v2/CollabAgentStatus.ts +5 -0
  146. package/src/protocol/v2/CollabAgentTool.ts +5 -0
  147. package/src/protocol/v2/CollabAgentToolCallStatus.ts +5 -0
  148. package/src/protocol/v2/CollaborationModeMask.ts +10 -0
  149. package/src/protocol/v2/CommandAction.ts +5 -0
  150. package/src/protocol/v2/CommandExecOutputDeltaNotification.ts +30 -0
  151. package/src/protocol/v2/CommandExecOutputStream.ts +8 -0
  152. package/src/protocol/v2/CommandExecParams.ts +97 -0
  153. package/src/protocol/v2/CommandExecResizeParams.ts +18 -0
  154. package/src/protocol/v2/CommandExecResizeResponse.ts +8 -0
  155. package/src/protocol/v2/CommandExecResponse.ts +24 -0
  156. package/src/protocol/v2/CommandExecTerminalSize.ts +16 -0
  157. package/src/protocol/v2/CommandExecTerminateParams.ts +13 -0
  158. package/src/protocol/v2/CommandExecTerminateResponse.ts +8 -0
  159. package/src/protocol/v2/CommandExecWriteParams.ts +22 -0
  160. package/src/protocol/v2/CommandExecWriteResponse.ts +8 -0
  161. package/src/protocol/v2/CommandExecutionApprovalDecision.ts +7 -0
  162. package/src/protocol/v2/CommandExecutionOutputDeltaNotification.ts +5 -0
  163. package/src/protocol/v2/CommandExecutionRequestApprovalParams.ts +57 -0
  164. package/src/protocol/v2/CommandExecutionRequestApprovalResponse.ts +6 -0
  165. package/src/protocol/v2/CommandExecutionSource.ts +5 -0
  166. package/src/protocol/v2/CommandExecutionStatus.ts +5 -0
  167. package/src/protocol/v2/Config.ts +23 -0
  168. package/src/protocol/v2/ConfigBatchWriteParams.ts +14 -0
  169. package/src/protocol/v2/ConfigEdit.ts +7 -0
  170. package/src/protocol/v2/ConfigLayer.ts +7 -0
  171. package/src/protocol/v2/ConfigLayerMetadata.ts +6 -0
  172. package/src/protocol/v2/ConfigLayerSource.ts +16 -0
  173. package/src/protocol/v2/ConfigReadParams.ts +11 -0
  174. package/src/protocol/v2/ConfigReadResponse.ts +8 -0
  175. package/src/protocol/v2/ConfigRequirements.ts +9 -0
  176. package/src/protocol/v2/ConfigRequirementsReadResponse.ts +10 -0
  177. package/src/protocol/v2/ConfigValueWriteParams.ts +11 -0
  178. package/src/protocol/v2/ConfigWarningNotification.ts +22 -0
  179. package/src/protocol/v2/ConfigWriteResponse.ts +12 -0
  180. package/src/protocol/v2/ContextCompactedNotification.ts +8 -0
  181. package/src/protocol/v2/CreditsSnapshot.ts +5 -0
  182. package/src/protocol/v2/DeprecationNoticeNotification.ts +13 -0
  183. package/src/protocol/v2/DynamicToolCallOutputContentItem.ts +5 -0
  184. package/src/protocol/v2/DynamicToolCallParams.ts +6 -0
  185. package/src/protocol/v2/DynamicToolCallResponse.ts +6 -0
  186. package/src/protocol/v2/DynamicToolCallStatus.ts +5 -0
  187. package/src/protocol/v2/DynamicToolSpec.ts +6 -0
  188. package/src/protocol/v2/ErrorNotification.ts +6 -0
  189. package/src/protocol/v2/ExecPolicyAmendment.ts +5 -0
  190. package/src/protocol/v2/ExperimentalFeature.ts +37 -0
  191. package/src/protocol/v2/ExperimentalFeatureEnablementSetParams.ts +12 -0
  192. package/src/protocol/v2/ExperimentalFeatureEnablementSetResponse.ts +9 -0
  193. package/src/protocol/v2/ExperimentalFeatureListParams.ts +13 -0
  194. package/src/protocol/v2/ExperimentalFeatureListResponse.ts +11 -0
  195. package/src/protocol/v2/ExperimentalFeatureStage.ts +5 -0
  196. package/src/protocol/v2/ExternalAgentConfigDetectParams.ts +13 -0
  197. package/src/protocol/v2/ExternalAgentConfigDetectResponse.ts +6 -0
  198. package/src/protocol/v2/ExternalAgentConfigImportParams.ts +6 -0
  199. package/src/protocol/v2/ExternalAgentConfigImportResponse.ts +5 -0
  200. package/src/protocol/v2/ExternalAgentConfigMigrationItem.ts +10 -0
  201. package/src/protocol/v2/ExternalAgentConfigMigrationItemType.ts +5 -0
  202. package/src/protocol/v2/FeedbackUploadParams.ts +5 -0
  203. package/src/protocol/v2/FeedbackUploadResponse.ts +5 -0
  204. package/src/protocol/v2/FileChangeApprovalDecision.ts +5 -0
  205. package/src/protocol/v2/FileChangeOutputDeltaNotification.ts +5 -0
  206. package/src/protocol/v2/FileChangeRequestApprovalParams.ts +14 -0
  207. package/src/protocol/v2/FileChangeRequestApprovalResponse.ts +6 -0
  208. package/src/protocol/v2/FileUpdateChange.ts +6 -0
  209. package/src/protocol/v2/FsChangedNotification.ts +17 -0
  210. package/src/protocol/v2/FsCopyParams.ts +21 -0
  211. package/src/protocol/v2/FsCopyResponse.ts +8 -0
  212. package/src/protocol/v2/FsCreateDirectoryParams.ts +17 -0
  213. package/src/protocol/v2/FsCreateDirectoryResponse.ts +8 -0
  214. package/src/protocol/v2/FsGetMetadataParams.ts +13 -0
  215. package/src/protocol/v2/FsGetMetadataResponse.ts +24 -0
  216. package/src/protocol/v2/FsReadDirectoryEntry.ts +20 -0
  217. package/src/protocol/v2/FsReadDirectoryParams.ts +13 -0
  218. package/src/protocol/v2/FsReadDirectoryResponse.ts +13 -0
  219. package/src/protocol/v2/FsReadFileParams.ts +13 -0
  220. package/src/protocol/v2/FsReadFileResponse.ts +12 -0
  221. package/src/protocol/v2/FsRemoveParams.ts +21 -0
  222. package/src/protocol/v2/FsRemoveResponse.ts +8 -0
  223. package/src/protocol/v2/FsUnwatchParams.ts +12 -0
  224. package/src/protocol/v2/FsUnwatchResponse.ts +8 -0
  225. package/src/protocol/v2/FsWatchParams.ts +13 -0
  226. package/src/protocol/v2/FsWatchResponse.ts +17 -0
  227. package/src/protocol/v2/FsWriteFileParams.ts +17 -0
  228. package/src/protocol/v2/FsWriteFileResponse.ts +8 -0
  229. package/src/protocol/v2/GetAccountParams.ts +13 -0
  230. package/src/protocol/v2/GetAccountRateLimitsResponse.ts +14 -0
  231. package/src/protocol/v2/GetAccountResponse.ts +6 -0
  232. package/src/protocol/v2/GitInfo.ts +5 -0
  233. package/src/protocol/v2/GrantedPermissionProfile.ts +7 -0
  234. package/src/protocol/v2/GuardianApprovalReview.ts +12 -0
  235. package/src/protocol/v2/GuardianApprovalReviewStatus.ts +8 -0
  236. package/src/protocol/v2/GuardianRiskLevel.ts +8 -0
  237. package/src/protocol/v2/HookCompletedNotification.ts +6 -0
  238. package/src/protocol/v2/HookEventName.ts +5 -0
  239. package/src/protocol/v2/HookExecutionMode.ts +5 -0
  240. package/src/protocol/v2/HookHandlerType.ts +5 -0
  241. package/src/protocol/v2/HookOutputEntry.ts +6 -0
  242. package/src/protocol/v2/HookOutputEntryKind.ts +5 -0
  243. package/src/protocol/v2/HookPromptFragment.ts +5 -0
  244. package/src/protocol/v2/HookRunStatus.ts +5 -0
  245. package/src/protocol/v2/HookRunSummary.ts +11 -0
  246. package/src/protocol/v2/HookScope.ts +5 -0
  247. package/src/protocol/v2/HookStartedNotification.ts +6 -0
  248. package/src/protocol/v2/ItemCompletedNotification.ts +6 -0
  249. package/src/protocol/v2/ItemGuardianApprovalReviewCompletedNotification.ts +15 -0
  250. package/src/protocol/v2/ItemGuardianApprovalReviewStartedNotification.ts +15 -0
  251. package/src/protocol/v2/ItemStartedNotification.ts +6 -0
  252. package/src/protocol/v2/ListMcpServerStatusParams.ts +13 -0
  253. package/src/protocol/v2/ListMcpServerStatusResponse.ts +11 -0
  254. package/src/protocol/v2/LoginAccountParams.ts +21 -0
  255. package/src/protocol/v2/LoginAccountResponse.ts +17 -0
  256. package/src/protocol/v2/LogoutAccountResponse.ts +5 -0
  257. package/src/protocol/v2/MarketplaceInterface.ts +5 -0
  258. package/src/protocol/v2/MarketplaceLoadErrorInfo.ts +6 -0
  259. package/src/protocol/v2/McpAuthStatus.ts +5 -0
  260. package/src/protocol/v2/McpElicitationArrayType.ts +5 -0
  261. package/src/protocol/v2/McpElicitationBooleanSchema.ts +6 -0
  262. package/src/protocol/v2/McpElicitationBooleanType.ts +5 -0
  263. package/src/protocol/v2/McpElicitationConstOption.ts +5 -0
  264. package/src/protocol/v2/McpElicitationEnumSchema.ts +8 -0
  265. package/src/protocol/v2/McpElicitationLegacyTitledEnumSchema.ts +6 -0
  266. package/src/protocol/v2/McpElicitationMultiSelectEnumSchema.ts +7 -0
  267. package/src/protocol/v2/McpElicitationNumberSchema.ts +6 -0
  268. package/src/protocol/v2/McpElicitationNumberType.ts +5 -0
  269. package/src/protocol/v2/McpElicitationObjectType.ts +5 -0
  270. package/src/protocol/v2/McpElicitationPrimitiveSchema.ts +9 -0
  271. package/src/protocol/v2/McpElicitationSchema.ts +13 -0
  272. package/src/protocol/v2/McpElicitationSingleSelectEnumSchema.ts +7 -0
  273. package/src/protocol/v2/McpElicitationStringFormat.ts +5 -0
  274. package/src/protocol/v2/McpElicitationStringSchema.ts +7 -0
  275. package/src/protocol/v2/McpElicitationStringType.ts +5 -0
  276. package/src/protocol/v2/McpElicitationTitledEnumItems.ts +6 -0
  277. package/src/protocol/v2/McpElicitationTitledMultiSelectEnumSchema.ts +7 -0
  278. package/src/protocol/v2/McpElicitationTitledSingleSelectEnumSchema.ts +7 -0
  279. package/src/protocol/v2/McpElicitationUntitledEnumItems.ts +6 -0
  280. package/src/protocol/v2/McpElicitationUntitledMultiSelectEnumSchema.ts +7 -0
  281. package/src/protocol/v2/McpElicitationUntitledSingleSelectEnumSchema.ts +6 -0
  282. package/src/protocol/v2/McpServerElicitationAction.ts +5 -0
  283. package/src/protocol/v2/McpServerElicitationRequestParams.ts +16 -0
  284. package/src/protocol/v2/McpServerElicitationRequestResponse.ts +17 -0
  285. package/src/protocol/v2/McpServerOauthLoginCompletedNotification.ts +5 -0
  286. package/src/protocol/v2/McpServerOauthLoginParams.ts +5 -0
  287. package/src/protocol/v2/McpServerOauthLoginResponse.ts +5 -0
  288. package/src/protocol/v2/McpServerRefreshResponse.ts +5 -0
  289. package/src/protocol/v2/McpServerStartupState.ts +5 -0
  290. package/src/protocol/v2/McpServerStatus.ts +9 -0
  291. package/src/protocol/v2/McpServerStatusUpdatedNotification.ts +6 -0
  292. package/src/protocol/v2/McpToolCallError.ts +5 -0
  293. package/src/protocol/v2/McpToolCallProgressNotification.ts +5 -0
  294. package/src/protocol/v2/McpToolCallResult.ts +6 -0
  295. package/src/protocol/v2/McpToolCallStatus.ts +5 -0
  296. package/src/protocol/v2/MemoryCitation.ts +6 -0
  297. package/src/protocol/v2/MemoryCitationEntry.ts +5 -0
  298. package/src/protocol/v2/MergeStrategy.ts +5 -0
  299. package/src/protocol/v2/Model.ts +10 -0
  300. package/src/protocol/v2/ModelAvailabilityNux.ts +5 -0
  301. package/src/protocol/v2/ModelListParams.ts +17 -0
  302. package/src/protocol/v2/ModelListResponse.ts +11 -0
  303. package/src/protocol/v2/ModelRerouteReason.ts +5 -0
  304. package/src/protocol/v2/ModelReroutedNotification.ts +6 -0
  305. package/src/protocol/v2/ModelUpgradeInfo.ts +5 -0
  306. package/src/protocol/v2/NetworkAccess.ts +5 -0
  307. package/src/protocol/v2/NetworkApprovalContext.ts +6 -0
  308. package/src/protocol/v2/NetworkApprovalProtocol.ts +5 -0
  309. package/src/protocol/v2/NetworkDomainPermission.ts +5 -0
  310. package/src/protocol/v2/NetworkPolicyAmendment.ts +6 -0
  311. package/src/protocol/v2/NetworkPolicyRuleAction.ts +5 -0
  312. package/src/protocol/v2/NetworkRequirements.ts +32 -0
  313. package/src/protocol/v2/NetworkUnixSocketPermission.ts +5 -0
  314. package/src/protocol/v2/NonSteerableTurnKind.ts +5 -0
  315. package/src/protocol/v2/OverriddenMetadata.ts +7 -0
  316. package/src/protocol/v2/PatchApplyStatus.ts +5 -0
  317. package/src/protocol/v2/PatchChangeKind.ts +5 -0
  318. package/src/protocol/v2/PermissionGrantScope.ts +5 -0
  319. package/src/protocol/v2/PermissionsRequestApprovalParams.ts +6 -0
  320. package/src/protocol/v2/PermissionsRequestApprovalResponse.ts +7 -0
  321. package/src/protocol/v2/PlanDeltaNotification.ts +9 -0
  322. package/src/protocol/v2/PluginAuthPolicy.ts +5 -0
  323. package/src/protocol/v2/PluginDetail.ts +9 -0
  324. package/src/protocol/v2/PluginInstallParams.ts +10 -0
  325. package/src/protocol/v2/PluginInstallPolicy.ts +5 -0
  326. package/src/protocol/v2/PluginInstallResponse.ts +7 -0
  327. package/src/protocol/v2/PluginInterface.ts +11 -0
  328. package/src/protocol/v2/PluginListParams.ts +16 -0
  329. package/src/protocol/v2/PluginListResponse.ts +7 -0
  330. package/src/protocol/v2/PluginMarketplaceEntry.ts +8 -0
  331. package/src/protocol/v2/PluginReadParams.ts +6 -0
  332. package/src/protocol/v2/PluginReadResponse.ts +6 -0
  333. package/src/protocol/v2/PluginSource.ts +6 -0
  334. package/src/protocol/v2/PluginSummary.ts +9 -0
  335. package/src/protocol/v2/PluginUninstallParams.ts +9 -0
  336. package/src/protocol/v2/PluginUninstallResponse.ts +5 -0
  337. package/src/protocol/v2/ProfileV2.ts +19 -0
  338. package/src/protocol/v2/RateLimitSnapshot.ts +8 -0
  339. package/src/protocol/v2/RateLimitWindow.ts +5 -0
  340. package/src/protocol/v2/RawResponseItemCompletedNotification.ts +6 -0
  341. package/src/protocol/v2/ReadOnlyAccess.ts +6 -0
  342. package/src/protocol/v2/ReasoningEffortOption.ts +6 -0
  343. package/src/protocol/v2/ReasoningSummaryPartAddedNotification.ts +5 -0
  344. package/src/protocol/v2/ReasoningSummaryTextDeltaNotification.ts +5 -0
  345. package/src/protocol/v2/ReasoningTextDeltaNotification.ts +5 -0
  346. package/src/protocol/v2/RequestPermissionProfile.ts +7 -0
  347. package/src/protocol/v2/ResidencyRequirement.ts +5 -0
  348. package/src/protocol/v2/ReviewDelivery.ts +5 -0
  349. package/src/protocol/v2/ReviewStartParams.ts +12 -0
  350. package/src/protocol/v2/ReviewStartResponse.ts +13 -0
  351. package/src/protocol/v2/ReviewTarget.ts +9 -0
  352. package/src/protocol/v2/SandboxMode.ts +5 -0
  353. package/src/protocol/v2/SandboxPolicy.ts +8 -0
  354. package/src/protocol/v2/SandboxWorkspaceWrite.ts +5 -0
  355. package/src/protocol/v2/ServerRequestResolvedNotification.ts +6 -0
  356. package/src/protocol/v2/SessionSource.ts +6 -0
  357. package/src/protocol/v2/SkillDependencies.ts +6 -0
  358. package/src/protocol/v2/SkillErrorInfo.ts +5 -0
  359. package/src/protocol/v2/SkillInterface.ts +5 -0
  360. package/src/protocol/v2/SkillMetadata.ts +12 -0
  361. package/src/protocol/v2/SkillScope.ts +5 -0
  362. package/src/protocol/v2/SkillSummary.ts +6 -0
  363. package/src/protocol/v2/SkillToolDependency.ts +5 -0
  364. package/src/protocol/v2/SkillsChangedNotification.ts +11 -0
  365. package/src/protocol/v2/SkillsConfigWriteParams.ts +14 -0
  366. package/src/protocol/v2/SkillsConfigWriteResponse.ts +5 -0
  367. package/src/protocol/v2/SkillsListEntry.ts +7 -0
  368. package/src/protocol/v2/SkillsListExtraRootsForCwd.ts +5 -0
  369. package/src/protocol/v2/SkillsListParams.ts +18 -0
  370. package/src/protocol/v2/SkillsListResponse.ts +6 -0
  371. package/src/protocol/v2/TerminalInteractionNotification.ts +5 -0
  372. package/src/protocol/v2/TextElement.ts +14 -0
  373. package/src/protocol/v2/TextPosition.ts +13 -0
  374. package/src/protocol/v2/TextRange.ts +6 -0
  375. package/src/protocol/v2/Thread.ts +72 -0
  376. package/src/protocol/v2/ThreadActiveFlag.ts +5 -0
  377. package/src/protocol/v2/ThreadArchiveParams.ts +5 -0
  378. package/src/protocol/v2/ThreadArchiveResponse.ts +5 -0
  379. package/src/protocol/v2/ThreadArchivedNotification.ts +5 -0
  380. package/src/protocol/v2/ThreadClosedNotification.ts +5 -0
  381. package/src/protocol/v2/ThreadCompactStartParams.ts +5 -0
  382. package/src/protocol/v2/ThreadCompactStartResponse.ts +5 -0
  383. package/src/protocol/v2/ThreadForkParams.ts +34 -0
  384. package/src/protocol/v2/ThreadForkResponse.ts +15 -0
  385. package/src/protocol/v2/ThreadItem.ts +100 -0
  386. package/src/protocol/v2/ThreadListParams.ts +43 -0
  387. package/src/protocol/v2/ThreadListResponse.ts +11 -0
  388. package/src/protocol/v2/ThreadLoadedListParams.ts +13 -0
  389. package/src/protocol/v2/ThreadLoadedListResponse.ts +14 -0
  390. package/src/protocol/v2/ThreadMetadataGitInfoUpdateParams.ts +20 -0
  391. package/src/protocol/v2/ThreadMetadataUpdateParams.ts +12 -0
  392. package/src/protocol/v2/ThreadMetadataUpdateResponse.ts +6 -0
  393. package/src/protocol/v2/ThreadNameUpdatedNotification.ts +5 -0
  394. package/src/protocol/v2/ThreadReadParams.ts +9 -0
  395. package/src/protocol/v2/ThreadReadResponse.ts +6 -0
  396. package/src/protocol/v2/ThreadRealtimeAudioChunk.ts +8 -0
  397. package/src/protocol/v2/ThreadRealtimeClosedNotification.ts +8 -0
  398. package/src/protocol/v2/ThreadRealtimeErrorNotification.ts +8 -0
  399. package/src/protocol/v2/ThreadRealtimeItemAddedNotification.ts +9 -0
  400. package/src/protocol/v2/ThreadRealtimeOutputAudioDeltaNotification.ts +9 -0
  401. package/src/protocol/v2/ThreadRealtimeStartedNotification.ts +9 -0
  402. package/src/protocol/v2/ThreadRealtimeTranscriptUpdatedNotification.ts +9 -0
  403. package/src/protocol/v2/ThreadResumeParams.ts +43 -0
  404. package/src/protocol/v2/ThreadResumeResponse.ts +15 -0
  405. package/src/protocol/v2/ThreadRollbackParams.ts +12 -0
  406. package/src/protocol/v2/ThreadRollbackResponse.ts +14 -0
  407. package/src/protocol/v2/ThreadSetNameParams.ts +5 -0
  408. package/src/protocol/v2/ThreadSetNameResponse.ts +5 -0
  409. package/src/protocol/v2/ThreadShellCommandParams.ts +12 -0
  410. package/src/protocol/v2/ThreadShellCommandResponse.ts +5 -0
  411. package/src/protocol/v2/ThreadSortKey.ts +5 -0
  412. package/src/protocol/v2/ThreadSourceKind.ts +5 -0
  413. package/src/protocol/v2/ThreadStartParams.ts +23 -0
  414. package/src/protocol/v2/ThreadStartResponse.ts +15 -0
  415. package/src/protocol/v2/ThreadStartedNotification.ts +6 -0
  416. package/src/protocol/v2/ThreadStatus.ts +6 -0
  417. package/src/protocol/v2/ThreadStatusChangedNotification.ts +6 -0
  418. package/src/protocol/v2/ThreadTokenUsage.ts +6 -0
  419. package/src/protocol/v2/ThreadTokenUsageUpdatedNotification.ts +6 -0
  420. package/src/protocol/v2/ThreadUnarchiveParams.ts +5 -0
  421. package/src/protocol/v2/ThreadUnarchiveResponse.ts +6 -0
  422. package/src/protocol/v2/ThreadUnarchivedNotification.ts +5 -0
  423. package/src/protocol/v2/ThreadUnsubscribeParams.ts +5 -0
  424. package/src/protocol/v2/ThreadUnsubscribeResponse.ts +6 -0
  425. package/src/protocol/v2/ThreadUnsubscribeStatus.ts +5 -0
  426. package/src/protocol/v2/TokenUsageBreakdown.ts +5 -0
  427. package/src/protocol/v2/ToolRequestUserInputAnswer.ts +8 -0
  428. package/src/protocol/v2/ToolRequestUserInputOption.ts +8 -0
  429. package/src/protocol/v2/ToolRequestUserInputParams.ts +9 -0
  430. package/src/protocol/v2/ToolRequestUserInputQuestion.ts +9 -0
  431. package/src/protocol/v2/ToolRequestUserInputResponse.ts +9 -0
  432. package/src/protocol/v2/ToolsV2.ts +6 -0
  433. package/src/protocol/v2/Turn.ts +18 -0
  434. package/src/protocol/v2/TurnCompletedNotification.ts +6 -0
  435. package/src/protocol/v2/TurnDiffUpdatedNotification.ts +9 -0
  436. package/src/protocol/v2/TurnError.ts +6 -0
  437. package/src/protocol/v2/TurnInterruptParams.ts +5 -0
  438. package/src/protocol/v2/TurnInterruptResponse.ts +5 -0
  439. package/src/protocol/v2/TurnPlanStep.ts +6 -0
  440. package/src/protocol/v2/TurnPlanStepStatus.ts +5 -0
  441. package/src/protocol/v2/TurnPlanUpdatedNotification.ts +6 -0
  442. package/src/protocol/v2/TurnStartParams.ts +54 -0
  443. package/src/protocol/v2/TurnStartResponse.ts +6 -0
  444. package/src/protocol/v2/TurnStartedNotification.ts +6 -0
  445. package/src/protocol/v2/TurnStatus.ts +5 -0
  446. package/src/protocol/v2/TurnSteerParams.ts +11 -0
  447. package/src/protocol/v2/TurnSteerResponse.ts +5 -0
  448. package/src/protocol/v2/UserInput.ts +10 -0
  449. package/src/protocol/v2/WebSearchAction.ts +5 -0
  450. package/src/protocol/v2/WindowsSandboxSetupCompletedNotification.ts +6 -0
  451. package/src/protocol/v2/WindowsSandboxSetupMode.ts +5 -0
  452. package/src/protocol/v2/WindowsSandboxSetupStartParams.ts +7 -0
  453. package/src/protocol/v2/WindowsSandboxSetupStartResponse.ts +5 -0
  454. package/src/protocol/v2/WindowsWorldWritableWarningNotification.ts +5 -0
  455. package/src/protocol/v2/WriteStatus.ts +5 -0
  456. package/src/protocol/v2/index.ts +346 -0
  457. package/src/services/app-server-client.ts +636 -0
  458. package/src/services/codex-runtime.ts +500 -0
  459. package/src/services/fleet-mode.ts +29 -0
  460. package/src/services/model-catalog.ts +86 -0
  461. package/src/services/profile-manager.ts +113 -0
  462. package/src/types/codex.ts +57 -0
@@ -0,0 +1,50 @@
1
+ export type RequestId = string | number;
2
+ export interface JsonLineRequest {
3
+ method: string;
4
+ id: RequestId;
5
+ params: unknown;
6
+ }
7
+ export interface JsonLineNotification {
8
+ method: string;
9
+ params: unknown;
10
+ }
11
+ export interface JsonLineResponse {
12
+ id: RequestId;
13
+ result?: unknown;
14
+ error?: unknown;
15
+ }
16
+ export type JsonLineMessage = JsonLineRequest | JsonLineNotification | JsonLineResponse;
17
+ export interface InitializeParams {
18
+ clientInfo: {
19
+ name: string;
20
+ title: string | null;
21
+ version: string;
22
+ };
23
+ capabilities: {
24
+ experimentalApi: boolean;
25
+ optOutNotificationMethods?: string[] | null;
26
+ } | null;
27
+ }
28
+ export interface PendingServerRequest {
29
+ id: RequestId;
30
+ method: string;
31
+ params: unknown;
32
+ createdAt: string;
33
+ resolvedAt?: string | undefined;
34
+ response?: unknown;
35
+ resolutionError?: string | undefined;
36
+ status: 'pending' | 'resolved' | 'failed';
37
+ }
38
+ export interface RuntimeOperation {
39
+ operationId: string;
40
+ requestId: RequestId;
41
+ method: string;
42
+ threadId?: string | undefined;
43
+ turnId?: string | undefined;
44
+ startedAt: string;
45
+ completedAt?: string | undefined;
46
+ status: 'running' | 'completed' | 'failed';
47
+ result?: unknown;
48
+ error?: string;
49
+ pendingRequestIds: RequestId[];
50
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/types/codex.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "mcp-codex-worker",
3
+ "version": "0.1.0",
4
+ "description": "MCP server bridge for Codex app-server",
5
+ "type": "module",
6
+ "main": "dist/src/index.js",
7
+ "bin": {
8
+ "mcp-codex-worker": "bin/mcp-codex-worker.mjs"
9
+ },
10
+ "files": [
11
+ "bin",
12
+ "dist/src",
13
+ "src",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.json",
18
+ "clean": "rm -rf dist",
19
+ "prepack": "npm run build",
20
+ "serve": "node --import tsx src/index.ts",
21
+ "smoke": "node --import tsx scripts/smoke.ts",
22
+ "test": "npm run test:unit",
23
+ "test:unit": "node --import tsx --test test/**/*.test.ts"
24
+ },
25
+ "keywords": [
26
+ "mcp",
27
+ "codex",
28
+ "app-server"
29
+ ],
30
+ "author": "Yigit Konur",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/yigitkonur/mcp-codex-worker.git"
35
+ },
36
+ "homepage": "https://github.com/yigitkonur/mcp-codex-worker#readme",
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "engines": {
41
+ "node": ">=22.0.0"
42
+ },
43
+ "dependencies": {
44
+ "@modelcontextprotocol/sdk": "^1.0.0",
45
+ "tsx": "^4.20.6",
46
+ "zod": "^3.24.4"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^22.15.3",
50
+ "typescript": "^5.8.3"
51
+ }
52
+ }
53
+
package/src/app.ts ADDED
@@ -0,0 +1,417 @@
1
+ import {
2
+ createToolDefinitions,
3
+ type RequestRespondInput,
4
+ type ThreadListInput,
5
+ type ThreadReadInput,
6
+ type ThreadResumeInput,
7
+ type ThreadStartInput,
8
+ type ToolDefinition,
9
+ type TurnInterruptInput,
10
+ type TurnStartInput,
11
+ type TurnSteerInput,
12
+ type WaitInput,
13
+ } from './mcp/tool-definitions.js';
14
+ import { OPERATION_POLL_INTERVAL_MS, REQUEST_TIMEOUT_MS } from './config/defaults.js';
15
+ import { CodexRuntime } from './services/codex-runtime.js';
16
+
17
+ export interface ResourceDefinition {
18
+ uri: string;
19
+ name: string;
20
+ description: string;
21
+ mimeType: string;
22
+ }
23
+
24
+ export class CodexWorkerApp {
25
+ private readonly runtime = new CodexRuntime();
26
+
27
+ async initialize(): Promise<void> {}
28
+
29
+ async shutdown(): Promise<void> {
30
+ await this.runtime.shutdown();
31
+ }
32
+
33
+ async listTools(): Promise<ToolDefinition[]> {
34
+ try {
35
+ const modelIds = await this.runtime.listVisibleModelIds();
36
+ return createToolDefinitions(modelIds);
37
+ } catch {
38
+ return createToolDefinitions([]);
39
+ }
40
+ }
41
+
42
+ listResources(): ResourceDefinition[] {
43
+ const base: ResourceDefinition[] = [
44
+ {
45
+ uri: 'codex://threads',
46
+ name: 'Codex Threads',
47
+ description: 'Latest threads from `thread/list`',
48
+ mimeType: 'application/json',
49
+ },
50
+ {
51
+ uri: 'codex://models',
52
+ name: 'Codex Models',
53
+ description: 'Visible models from `model/list`',
54
+ mimeType: 'application/json',
55
+ },
56
+ {
57
+ uri: 'codex://account',
58
+ name: 'Codex Account',
59
+ description: 'Account data from `account/read`',
60
+ mimeType: 'application/json',
61
+ },
62
+ {
63
+ uri: 'codex://requests',
64
+ name: 'Codex Requests',
65
+ description: 'Pending server requests from app-server',
66
+ mimeType: 'application/json',
67
+ },
68
+ ];
69
+
70
+ for (const threadId of this.runtime.listKnownThreadIds()) {
71
+ base.push(
72
+ {
73
+ uri: `codex://thread/${threadId}`,
74
+ name: `Thread ${threadId}`,
75
+ description: 'Thread from `thread/read`',
76
+ mimeType: 'application/json',
77
+ },
78
+ {
79
+ uri: `codex://thread/${threadId}/events`,
80
+ name: `Thread ${threadId} events`,
81
+ description: 'Observed notifications for this thread',
82
+ mimeType: 'application/json',
83
+ },
84
+ );
85
+ }
86
+
87
+ return base;
88
+ }
89
+
90
+ async readResource(uri: string): Promise<{ mimeType: string; text: string }> {
91
+ if (uri === 'codex://threads') {
92
+ const response = await this.runtime.request('thread/list', { limit: 50 }) as {
93
+ data?: Array<{ id?: string }>;
94
+ };
95
+ for (const row of response.data ?? []) {
96
+ if (typeof row.id === 'string') {
97
+ this.runtime.rememberThreadId(row.id);
98
+ }
99
+ }
100
+ return {
101
+ mimeType: 'application/json',
102
+ text: JSON.stringify(response, null, 2),
103
+ };
104
+ }
105
+
106
+ if (uri === 'codex://models') {
107
+ const response = {
108
+ data: await this.runtime.listModels(false),
109
+ };
110
+ return {
111
+ mimeType: 'application/json',
112
+ text: JSON.stringify(response, null, 2),
113
+ };
114
+ }
115
+
116
+ if (uri === 'codex://account') {
117
+ const [account, limits] = await Promise.all([
118
+ this.runtime.request('account/read', {}),
119
+ this.runtime.request('account/rateLimits/read', {}),
120
+ ]);
121
+ return {
122
+ mimeType: 'application/json',
123
+ text: JSON.stringify({ account, rate_limits: limits }, null, 2),
124
+ };
125
+ }
126
+
127
+ if (uri === 'codex://requests') {
128
+ return {
129
+ mimeType: 'application/json',
130
+ text: JSON.stringify({
131
+ requests: this.runtime.getPendingServerRequests(false),
132
+ }, null, 2),
133
+ };
134
+ }
135
+
136
+ const threadEventsMatch = /^codex:\/\/thread\/([^/]+)\/events$/.exec(uri);
137
+ if (threadEventsMatch) {
138
+ const threadId = decodeURIComponent(threadEventsMatch[1]!);
139
+ return {
140
+ mimeType: 'application/json',
141
+ text: JSON.stringify({
142
+ thread_id: threadId,
143
+ events: await this.runtime.getThreadEvents(threadId),
144
+ }, null, 2),
145
+ };
146
+ }
147
+
148
+ const threadMatch = /^codex:\/\/thread\/([^/]+)$/.exec(uri);
149
+ if (threadMatch) {
150
+ const threadId = decodeURIComponent(threadMatch[1]!);
151
+ const response = await this.runtime.request('thread/read', {
152
+ threadId,
153
+ includeTurns: true,
154
+ });
155
+ return {
156
+ mimeType: 'application/json',
157
+ text: JSON.stringify(response, null, 2),
158
+ };
159
+ }
160
+
161
+ return {
162
+ mimeType: 'application/json',
163
+ text: JSON.stringify({ error: `Unknown resource URI: ${uri}` }, null, 2),
164
+ };
165
+ }
166
+
167
+ async callTool(name: string, args: unknown): Promise<string> {
168
+ const tools = await this.listTools();
169
+ const tool = tools.find((candidate) => candidate.name === name);
170
+ if (!tool) {
171
+ throw new Error(`Unknown tool: ${name}`);
172
+ }
173
+ const validated = tool.validate(args ?? {});
174
+ switch (name) {
175
+ case 'thread-start':
176
+ return this.handleThreadStart(validated as ThreadStartInput);
177
+ case 'thread-resume':
178
+ return this.handleThreadResume(validated as ThreadResumeInput);
179
+ case 'thread-read':
180
+ return this.handleThreadRead(validated as ThreadReadInput);
181
+ case 'thread-list':
182
+ return this.handleThreadList(validated as ThreadListInput);
183
+ case 'turn-start':
184
+ return this.handleTurnStart(validated as TurnStartInput);
185
+ case 'turn-steer':
186
+ return this.handleTurnSteer(validated as TurnSteerInput);
187
+ case 'turn-interrupt':
188
+ return this.handleTurnInterrupt(validated as TurnInterruptInput);
189
+ case 'model-list':
190
+ return JSON.stringify({
191
+ data: await this.runtime.listModels(false),
192
+ }, null, 2);
193
+ case 'account-read':
194
+ return JSON.stringify(await this.runtime.request('account/read', {}), null, 2);
195
+ case 'account-rate-limits-read':
196
+ return JSON.stringify(await this.runtime.request('account/rateLimits/read', {}), null, 2);
197
+ case 'skills-list':
198
+ return JSON.stringify(await this.runtime.request('skills/list', {}), null, 2);
199
+ case 'app-list':
200
+ return JSON.stringify(await this.runtime.request('app/list', {}), null, 2);
201
+ case 'request-list':
202
+ return JSON.stringify({
203
+ requests: this.runtime.getPendingServerRequests(
204
+ Boolean((validated as { include_resolved?: boolean }).include_resolved),
205
+ ),
206
+ }, null, 2);
207
+ case 'request-read':
208
+ return JSON.stringify({
209
+ request: this.runtime.getPendingServerRequest(
210
+ (validated as { request_id: string | number }).request_id,
211
+ ) ?? null,
212
+ }, null, 2);
213
+ case 'request-respond':
214
+ return this.handleRequestRespond(validated as RequestRespondInput);
215
+ case 'wait':
216
+ return this.handleWait(validated as WaitInput);
217
+ default:
218
+ throw new Error(`Unhandled tool: ${name}`);
219
+ }
220
+ }
221
+
222
+ private async handleThreadStart(input: ThreadStartInput): Promise<string> {
223
+ const built = await this.runtime.buildThreadStartParams({
224
+ model: input.model,
225
+ cwd: input.cwd,
226
+ developerInstructions: input.developer_instructions,
227
+ });
228
+ const response = await this.runtime.request('thread/start', built.params);
229
+ const threadId = (response as { thread?: { id?: string } }).thread?.id;
230
+ if (threadId) {
231
+ this.runtime.rememberThreadId(threadId);
232
+ }
233
+ return JSON.stringify({
234
+ method: 'thread/start',
235
+ remapped_from: built.remappedFrom,
236
+ result: response,
237
+ }, null, 2);
238
+ }
239
+
240
+ private async handleThreadResume(input: ThreadResumeInput): Promise<string> {
241
+ const built = await this.runtime.buildThreadResumeParams({
242
+ threadId: input.thread_id,
243
+ model: input.model,
244
+ cwd: input.cwd,
245
+ developerInstructions: input.developer_instructions,
246
+ });
247
+ const response = await this.runtime.request('thread/resume', built.params);
248
+ this.runtime.rememberThreadId(input.thread_id);
249
+ return JSON.stringify({
250
+ method: 'thread/resume',
251
+ remapped_from: built.remappedFrom,
252
+ result: response,
253
+ }, null, 2);
254
+ }
255
+
256
+ private async handleThreadRead(input: ThreadReadInput): Promise<string> {
257
+ const response = await this.runtime.request('thread/read', {
258
+ threadId: input.thread_id,
259
+ includeTurns: input.include_turns ?? true,
260
+ });
261
+ this.runtime.rememberThreadId(input.thread_id);
262
+ return JSON.stringify(response, null, 2);
263
+ }
264
+
265
+ private async handleThreadList(input: ThreadListInput): Promise<string> {
266
+ const response = await this.runtime.request('thread/list', {
267
+ limit: input.limit,
268
+ cursor: input.cursor ?? null,
269
+ }) as {
270
+ data?: Array<{ id?: string }>;
271
+ };
272
+ for (const row of response.data ?? []) {
273
+ if (typeof row.id === 'string') {
274
+ this.runtime.rememberThreadId(row.id);
275
+ }
276
+ }
277
+ return JSON.stringify(response, null, 2);
278
+ }
279
+
280
+ private async handleTurnStart(input: TurnStartInput): Promise<string> {
281
+ const built = await this.runtime.buildTurnStartParams({
282
+ threadId: input.thread_id,
283
+ userInput: input.user_input,
284
+ model: input.model,
285
+ });
286
+ await this.runtime.ensureThreadLoaded(input.thread_id, input.model);
287
+ const bridged = await this.runtime.requestWithBridge('turn/start', built.params, {
288
+ threadId: input.thread_id,
289
+ });
290
+ return JSON.stringify({
291
+ method: 'turn/start',
292
+ remapped_from: built.remappedFrom,
293
+ ...bridged,
294
+ }, null, 2);
295
+ }
296
+
297
+ private async handleTurnSteer(input: TurnSteerInput): Promise<string> {
298
+ const params = this.runtime.buildTurnSteerParams({
299
+ threadId: input.thread_id,
300
+ expectedTurnId: input.expected_turn_id,
301
+ userInput: input.user_input,
302
+ });
303
+ const bridged = await this.runtime.requestWithBridge('turn/steer', params, {
304
+ threadId: input.thread_id,
305
+ });
306
+ return JSON.stringify({
307
+ method: 'turn/steer',
308
+ ...bridged,
309
+ }, null, 2);
310
+ }
311
+
312
+ private async handleTurnInterrupt(input: TurnInterruptInput): Promise<string> {
313
+ const response = await this.runtime.request('turn/interrupt', {
314
+ threadId: input.thread_id,
315
+ turnId: input.turn_id,
316
+ });
317
+ return JSON.stringify(response, null, 2);
318
+ }
319
+
320
+ private async handleRequestRespond(input: RequestRespondInput): Promise<string> {
321
+ const pending = this.runtime.getPendingServerRequest(input.request_id);
322
+ if (!pending) {
323
+ throw new Error(`Pending server request not found: ${String(input.request_id)}`);
324
+ }
325
+
326
+ const payload = this.buildServerRequestPayload(pending.method, input);
327
+ await this.runtime.respondToServerRequest(input.request_id, payload);
328
+ return JSON.stringify({
329
+ request_id: input.request_id,
330
+ method: pending.method,
331
+ payload,
332
+ status: 'responded',
333
+ }, null, 2);
334
+ }
335
+
336
+ private async handleWait(input: WaitInput): Promise<string> {
337
+ const timeoutMs = input.timeout_ms ?? REQUEST_TIMEOUT_MS;
338
+ const pollIntervalMs = input.poll_interval_ms ?? OPERATION_POLL_INTERVAL_MS;
339
+
340
+ if (input.operation_id) {
341
+ const operation = await this.runtime.waitForOperation(input.operation_id, timeoutMs, pollIntervalMs);
342
+ return JSON.stringify(operation, null, 2);
343
+ }
344
+
345
+ if (input.thread_id) {
346
+ const start = Date.now();
347
+ while (Date.now() - start <= timeoutMs) {
348
+ const response = await this.runtime.request('thread/read', {
349
+ threadId: input.thread_id,
350
+ includeTurns: false,
351
+ }) as {
352
+ thread?: {
353
+ status?: { type?: string };
354
+ };
355
+ };
356
+ const statusType = response.thread?.status?.type;
357
+ if (statusType !== 'active') {
358
+ return JSON.stringify({
359
+ thread_id: input.thread_id,
360
+ status: statusType ?? 'unknown',
361
+ thread: response.thread ?? null,
362
+ }, null, 2);
363
+ }
364
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
365
+ }
366
+ throw new Error(`Timed out waiting for thread ${input.thread_id}`);
367
+ }
368
+
369
+ return JSON.stringify({
370
+ requests: this.runtime.getPendingServerRequests(false),
371
+ operations: [],
372
+ }, null, 2);
373
+ }
374
+
375
+ private buildServerRequestPayload(method: string, input: RequestRespondInput): unknown {
376
+ if (input.payload) {
377
+ return input.payload;
378
+ }
379
+
380
+ switch (method) {
381
+ case 'item/commandExecution/requestApproval':
382
+ case 'item/fileChange/requestApproval':
383
+ return {
384
+ decision: input.decision ?? 'accept',
385
+ };
386
+ case 'item/tool/requestUserInput':
387
+ return {
388
+ answers: input.answers ?? {},
389
+ };
390
+ case 'mcpServer/elicitation/request':
391
+ return {
392
+ action: input.action ?? 'accept',
393
+ content: input.content ?? null,
394
+ _meta: input.meta ?? null,
395
+ };
396
+ case 'item/permissions/requestApproval':
397
+ return {
398
+ permissions: input.permissions ?? {},
399
+ scope: input.scope ?? 'session',
400
+ };
401
+ case 'item/tool/call':
402
+ return {
403
+ contentItems: [],
404
+ success: true,
405
+ };
406
+ case 'applyPatchApproval':
407
+ case 'execCommandApproval':
408
+ return {
409
+ decision: input.decision ?? 'approved',
410
+ };
411
+ default:
412
+ throw new Error(
413
+ `No default response payload for request method ${method}. Provide payload explicitly.`,
414
+ );
415
+ }
416
+ }
417
+ }
@@ -0,0 +1,14 @@
1
+ export const APP_NAME = 'mcp-codex-worker';
2
+ export const APP_TITLE = 'MCP Codex Worker';
3
+ export const REQUEST_TIMEOUT_MS = 120_000;
4
+ export const OPERATION_BRIDGE_TIMEOUT_MS = 2_000;
5
+ export const OPERATION_POLL_INTERVAL_MS = 250;
6
+
7
+ export const CODEX_APP_SERVER_COMMAND_ENV = 'CODEX_APP_SERVER_COMMAND';
8
+ export const CODEX_APP_SERVER_ARGS_ENV = 'CODEX_APP_SERVER_ARGS';
9
+ export const CODEX_HOME_ENV = 'CODEX_HOME';
10
+ export const CODEX_HOME_DIRS_ENV = 'CODEX_HOME_DIRS';
11
+ export const CODEX_ENABLE_FLEET_ENV = 'CODEX_ENABLE_FLEET';
12
+
13
+ export const PROFILE_COOLDOWN_MS = 60_000;
14
+
package/src/index.ts ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { createRequire } from 'node:module';
4
+
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
+ import {
8
+ CallToolRequestSchema,
9
+ ListResourcesRequestSchema,
10
+ ListToolsRequestSchema,
11
+ ReadResourceRequestSchema,
12
+ } from '@modelcontextprotocol/sdk/types.js';
13
+
14
+ import { CodexWorkerApp } from './app.js';
15
+
16
+ const require = createRequire(import.meta.url);
17
+ const pkg = require('../package.json') as { version: string };
18
+
19
+ const app = new CodexWorkerApp();
20
+ const server = new Server(
21
+ { name: 'mcp-codex-worker', version: pkg.version },
22
+ {
23
+ capabilities: {
24
+ tools: {},
25
+ resources: {},
26
+ },
27
+ },
28
+ );
29
+
30
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
31
+ tools: (await app.listTools()).map((tool) => ({
32
+ name: tool.name,
33
+ description: tool.description,
34
+ inputSchema: tool.inputSchema,
35
+ })),
36
+ }));
37
+
38
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
39
+ try {
40
+ const text = await app.callTool(request.params.name, request.params.arguments ?? {});
41
+ return { content: [{ type: 'text', text }] };
42
+ } catch (error) {
43
+ return {
44
+ content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }],
45
+ isError: true as const,
46
+ };
47
+ }
48
+ });
49
+
50
+ server.setRequestHandler(ListResourcesRequestSchema, async () => ({
51
+ resources: app.listResources(),
52
+ }));
53
+
54
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
55
+ const resource = await app.readResource(request.params.uri);
56
+ return {
57
+ contents: [{
58
+ uri: request.params.uri,
59
+ mimeType: resource.mimeType,
60
+ text: resource.text,
61
+ }],
62
+ };
63
+ });
64
+
65
+ async function main(): Promise<void> {
66
+ await app.initialize();
67
+ const transport = new StdioServerTransport();
68
+ await server.connect(transport);
69
+ process.stdin.resume();
70
+
71
+ const shutdown = async () => {
72
+ await app.shutdown().catch(() => {});
73
+ process.exit(0);
74
+ };
75
+
76
+ process.on('SIGINT', () => void shutdown());
77
+ process.on('SIGTERM', () => void shutdown());
78
+ }
79
+
80
+ main().catch((error) => {
81
+ console.error(error);
82
+ process.exit(1);
83
+ });
84
+