@nimrobo/mcporter-remote 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 (741) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.gitattributes +2 -0
  3. package/.github/workflows/ci.yml +26 -0
  4. package/AGENTS.md +109 -0
  5. package/CHANGELOG.md +361 -0
  6. package/LICENSE +21 -0
  7. package/README.md +449 -0
  8. package/bin/git +180 -0
  9. package/biome.json +43 -0
  10. package/config/mcporter.json +134 -0
  11. package/dist/cli/adhoc-server.d.ts +21 -0
  12. package/dist/cli/adhoc-server.d.ts.map +1 -0
  13. package/dist/cli/adhoc-server.js +228 -0
  14. package/dist/cli/adhoc-server.js.map +1 -0
  15. package/dist/cli/auth-command.d.ts +6 -0
  16. package/dist/cli/auth-command.d.ts.map +1 -0
  17. package/dist/cli/auth-command.js +257 -0
  18. package/dist/cli/auth-command.js.map +1 -0
  19. package/dist/cli/call-argument-expression.d.ts +5 -0
  20. package/dist/cli/call-argument-expression.d.ts.map +1 -0
  21. package/dist/cli/call-argument-expression.js +57 -0
  22. package/dist/cli/call-argument-expression.js.map +1 -0
  23. package/dist/cli/call-argument-values.d.ts +10 -0
  24. package/dist/cli/call-argument-values.d.ts.map +1 -0
  25. package/dist/cli/call-argument-values.js +83 -0
  26. package/dist/cli/call-argument-values.js.map +1 -0
  27. package/dist/cli/call-arguments.d.ts +17 -0
  28. package/dist/cli/call-arguments.d.ts.map +1 -0
  29. package/dist/cli/call-arguments.js +183 -0
  30. package/dist/cli/call-arguments.js.map +1 -0
  31. package/dist/cli/call-command.d.ts +5 -0
  32. package/dist/cli/call-command.d.ts.map +1 -0
  33. package/dist/cli/call-command.js +371 -0
  34. package/dist/cli/call-command.js.map +1 -0
  35. package/dist/cli/call-expression-parser.d.ts +9 -0
  36. package/dist/cli/call-expression-parser.d.ts.map +1 -0
  37. package/dist/cli/call-expression-parser.js +177 -0
  38. package/dist/cli/call-expression-parser.js.map +1 -0
  39. package/dist/cli/cli-factory.d.ts +16 -0
  40. package/dist/cli/cli-factory.d.ts.map +1 -0
  41. package/dist/cli/cli-factory.js +37 -0
  42. package/dist/cli/cli-factory.js.map +1 -0
  43. package/dist/cli/command-inference.d.ts +12 -0
  44. package/dist/cli/command-inference.d.ts.map +1 -0
  45. package/dist/cli/command-inference.js +75 -0
  46. package/dist/cli/command-inference.js.map +1 -0
  47. package/dist/cli/config/add.d.ts +23 -0
  48. package/dist/cli/config/add.d.ts.map +1 -0
  49. package/dist/cli/config/add.js +267 -0
  50. package/dist/cli/config/add.js.map +1 -0
  51. package/dist/cli/config/auth.d.ts +4 -0
  52. package/dist/cli/config/auth.d.ts.map +1 -0
  53. package/dist/cli/config/auth.js +21 -0
  54. package/dist/cli/config/auth.js.map +1 -0
  55. package/dist/cli/config/doctor.d.ts +3 -0
  56. package/dist/cli/config/doctor.d.ts.map +1 -0
  57. package/dist/cli/config/doctor.js +26 -0
  58. package/dist/cli/config/doctor.js.map +1 -0
  59. package/dist/cli/config/get.d.ts +3 -0
  60. package/dist/cli/config/get.d.ts.map +1 -0
  61. package/dist/cli/config/get.js +45 -0
  62. package/dist/cli/config/get.js.map +1 -0
  63. package/dist/cli/config/help.d.ts +18 -0
  64. package/dist/cli/config/help.d.ts.map +1 -0
  65. package/dist/cli/config/help.js +193 -0
  66. package/dist/cli/config/help.js.map +1 -0
  67. package/dist/cli/config/import.d.ts +9 -0
  68. package/dist/cli/config/import.d.ts.map +1 -0
  69. package/dist/cli/config/import.js +88 -0
  70. package/dist/cli/config/import.js.map +1 -0
  71. package/dist/cli/config/index.d.ts +2 -0
  72. package/dist/cli/config/index.d.ts.map +1 -0
  73. package/dist/cli/config/index.js +2 -0
  74. package/dist/cli/config/index.js.map +1 -0
  75. package/dist/cli/config/list.d.ts +7 -0
  76. package/dist/cli/config/list.d.ts.map +1 -0
  77. package/dist/cli/config/list.js +71 -0
  78. package/dist/cli/config/list.js.map +1 -0
  79. package/dist/cli/config/remove.d.ts +3 -0
  80. package/dist/cli/config/remove.d.ts.map +1 -0
  81. package/dist/cli/config/remove.js +19 -0
  82. package/dist/cli/config/remove.js.map +1 -0
  83. package/dist/cli/config/render.d.ts +26 -0
  84. package/dist/cli/config/render.d.ts.map +1 -0
  85. package/dist/cli/config/render.js +99 -0
  86. package/dist/cli/config/render.js.map +1 -0
  87. package/dist/cli/config/shared.d.ts +21 -0
  88. package/dist/cli/config/shared.d.ts.map +1 -0
  89. package/dist/cli/config/shared.js +130 -0
  90. package/dist/cli/config/shared.js.map +1 -0
  91. package/dist/cli/config/types.d.ts +7 -0
  92. package/dist/cli/config/types.d.ts.map +1 -0
  93. package/dist/cli/config/types.js +2 -0
  94. package/dist/cli/config/types.js.map +1 -0
  95. package/dist/cli/config-command.d.ts +7 -0
  96. package/dist/cli/config-command.d.ts.map +1 -0
  97. package/dist/cli/config-command.js +67 -0
  98. package/dist/cli/config-command.js.map +1 -0
  99. package/dist/cli/daemon-command.d.ts +8 -0
  100. package/dist/cli/daemon-command.d.ts.map +1 -0
  101. package/dist/cli/daemon-command.js +219 -0
  102. package/dist/cli/daemon-command.js.map +1 -0
  103. package/dist/cli/emit-ts-command.d.ts +31 -0
  104. package/dist/cli/emit-ts-command.d.ts.map +1 -0
  105. package/dist/cli/emit-ts-command.js +217 -0
  106. package/dist/cli/emit-ts-command.js.map +1 -0
  107. package/dist/cli/emit-ts-templates.d.ts +23 -0
  108. package/dist/cli/emit-ts-templates.d.ts.map +1 -0
  109. package/dist/cli/emit-ts-templates.js +130 -0
  110. package/dist/cli/emit-ts-templates.js.map +1 -0
  111. package/dist/cli/ephemeral-flags.d.ts +7 -0
  112. package/dist/cli/ephemeral-flags.d.ts.map +1 -0
  113. package/dist/cli/ephemeral-flags.js +108 -0
  114. package/dist/cli/ephemeral-flags.js.map +1 -0
  115. package/dist/cli/ephemeral-target.d.ts +16 -0
  116. package/dist/cli/ephemeral-target.d.ts.map +1 -0
  117. package/dist/cli/ephemeral-target.js +105 -0
  118. package/dist/cli/ephemeral-target.js.map +1 -0
  119. package/dist/cli/errors.d.ts +4 -0
  120. package/dist/cli/errors.d.ts.map +1 -0
  121. package/dist/cli/errors.js +7 -0
  122. package/dist/cli/errors.js.map +1 -0
  123. package/dist/cli/flag-utils.d.ts +4 -0
  124. package/dist/cli/flag-utils.d.ts.map +1 -0
  125. package/dist/cli/flag-utils.js +27 -0
  126. package/dist/cli/flag-utils.js.map +1 -0
  127. package/dist/cli/generate/artifacts.d.ts +15 -0
  128. package/dist/cli/generate/artifacts.d.ts.map +1 -0
  129. package/dist/cli/generate/artifacts.js +247 -0
  130. package/dist/cli/generate/artifacts.js.map +1 -0
  131. package/dist/cli/generate/definition.d.ts +22 -0
  132. package/dist/cli/generate/definition.d.ts.map +1 -0
  133. package/dist/cli/generate/definition.js +265 -0
  134. package/dist/cli/generate/definition.js.map +1 -0
  135. package/dist/cli/generate/flag-parser.d.ts +11 -0
  136. package/dist/cli/generate/flag-parser.d.ts.map +1 -0
  137. package/dist/cli/generate/flag-parser.js +41 -0
  138. package/dist/cli/generate/flag-parser.js.map +1 -0
  139. package/dist/cli/generate/flags.d.ts +20 -0
  140. package/dist/cli/generate/flags.d.ts.map +1 -0
  141. package/dist/cli/generate/flags.js +220 -0
  142. package/dist/cli/generate/flags.js.map +1 -0
  143. package/dist/cli/generate/fs-helpers.d.ts +3 -0
  144. package/dist/cli/generate/fs-helpers.d.ts.map +1 -0
  145. package/dist/cli/generate/fs-helpers.js +34 -0
  146. package/dist/cli/generate/fs-helpers.js.map +1 -0
  147. package/dist/cli/generate/name-utils.d.ts +5 -0
  148. package/dist/cli/generate/name-utils.d.ts.map +1 -0
  149. package/dist/cli/generate/name-utils.js +170 -0
  150. package/dist/cli/generate/name-utils.js.map +1 -0
  151. package/dist/cli/generate/output.d.ts +5 -0
  152. package/dist/cli/generate/output.d.ts.map +1 -0
  153. package/dist/cli/generate/output.js +24 -0
  154. package/dist/cli/generate/output.js.map +1 -0
  155. package/dist/cli/generate/runtime.d.ts +3 -0
  156. package/dist/cli/generate/runtime.d.ts.map +1 -0
  157. package/dist/cli/generate/runtime.js +34 -0
  158. package/dist/cli/generate/runtime.js.map +1 -0
  159. package/dist/cli/generate/server-utils.d.ts +3 -0
  160. package/dist/cli/generate/server-utils.d.ts.map +1 -0
  161. package/dist/cli/generate/server-utils.js +33 -0
  162. package/dist/cli/generate/server-utils.js.map +1 -0
  163. package/dist/cli/generate/template-data.d.ts +25 -0
  164. package/dist/cli/generate/template-data.d.ts.map +1 -0
  165. package/dist/cli/generate/template-data.js +90 -0
  166. package/dist/cli/generate/template-data.js.map +1 -0
  167. package/dist/cli/generate/template-help.d.ts +2 -0
  168. package/dist/cli/generate/template-help.d.ts.map +1 -0
  169. package/dist/cli/generate/template-help.js +113 -0
  170. package/dist/cli/generate/template-help.js.map +1 -0
  171. package/dist/cli/generate/template.d.ts +30 -0
  172. package/dist/cli/generate/template.d.ts.map +1 -0
  173. package/dist/cli/generate/template.js +366 -0
  174. package/dist/cli/generate/template.js.map +1 -0
  175. package/dist/cli/generate/tools.d.ts +46 -0
  176. package/dist/cli/generate/tools.d.ts.map +1 -0
  177. package/dist/cli/generate/tools.js +304 -0
  178. package/dist/cli/generate/tools.js.map +1 -0
  179. package/dist/cli/generate/types.d.ts +5 -0
  180. package/dist/cli/generate/types.d.ts.map +1 -0
  181. package/dist/cli/generate/types.js +2 -0
  182. package/dist/cli/generate/types.js.map +1 -0
  183. package/dist/cli/generate-cli-runner.d.ts +3 -0
  184. package/dist/cli/generate-cli-runner.d.ts.map +1 -0
  185. package/dist/cli/generate-cli-runner.js +72 -0
  186. package/dist/cli/generate-cli-runner.js.map +1 -0
  187. package/dist/cli/help-output.d.ts +6 -0
  188. package/dist/cli/help-output.d.ts.map +1 -0
  189. package/dist/cli/help-output.js +186 -0
  190. package/dist/cli/help-output.js.map +1 -0
  191. package/dist/cli/http-utils.d.ts +9 -0
  192. package/dist/cli/http-utils.d.ts.map +1 -0
  193. package/dist/cli/http-utils.js +88 -0
  194. package/dist/cli/http-utils.js.map +1 -0
  195. package/dist/cli/identifier-helpers.d.ts +20 -0
  196. package/dist/cli/identifier-helpers.d.ts.map +1 -0
  197. package/dist/cli/identifier-helpers.js +84 -0
  198. package/dist/cli/identifier-helpers.js.map +1 -0
  199. package/dist/cli/image-output.d.ts +3 -0
  200. package/dist/cli/image-output.d.ts.map +1 -0
  201. package/dist/cli/image-output.js +57 -0
  202. package/dist/cli/image-output.js.map +1 -0
  203. package/dist/cli/inspect-cli-command.d.ts +11 -0
  204. package/dist/cli/inspect-cli-command.d.ts.map +1 -0
  205. package/dist/cli/inspect-cli-command.js +78 -0
  206. package/dist/cli/inspect-cli-command.js.map +1 -0
  207. package/dist/cli/json-output.d.ts +23 -0
  208. package/dist/cli/json-output.d.ts.map +1 -0
  209. package/dist/cli/json-output.js +38 -0
  210. package/dist/cli/json-output.js.map +1 -0
  211. package/dist/cli/list-command.d.ts +15 -0
  212. package/dist/cli/list-command.d.ts.map +1 -0
  213. package/dist/cli/list-command.js +372 -0
  214. package/dist/cli/list-command.js.map +1 -0
  215. package/dist/cli/list-detail-helpers.d.ts +41 -0
  216. package/dist/cli/list-detail-helpers.d.ts.map +1 -0
  217. package/dist/cli/list-detail-helpers.js +99 -0
  218. package/dist/cli/list-detail-helpers.js.map +1 -0
  219. package/dist/cli/list-doc-comments.d.ts +6 -0
  220. package/dist/cli/list-doc-comments.d.ts.map +1 -0
  221. package/dist/cli/list-doc-comments.js +114 -0
  222. package/dist/cli/list-doc-comments.js.map +1 -0
  223. package/dist/cli/list-format.d.ts +38 -0
  224. package/dist/cli/list-format.d.ts.map +1 -0
  225. package/dist/cli/list-format.js +98 -0
  226. package/dist/cli/list-format.js.map +1 -0
  227. package/dist/cli/list-output.d.ts +39 -0
  228. package/dist/cli/list-output.d.ts.map +1 -0
  229. package/dist/cli/list-output.js +159 -0
  230. package/dist/cli/list-output.js.map +1 -0
  231. package/dist/cli/list-signature.d.ts +26 -0
  232. package/dist/cli/list-signature.d.ts.map +1 -0
  233. package/dist/cli/list-signature.js +176 -0
  234. package/dist/cli/list-signature.js.map +1 -0
  235. package/dist/cli/logger-context.d.ts +9 -0
  236. package/dist/cli/logger-context.d.ts.map +1 -0
  237. package/dist/cli/logger-context.js +29 -0
  238. package/dist/cli/logger-context.js.map +1 -0
  239. package/dist/cli/output-format.d.ts +11 -0
  240. package/dist/cli/output-format.d.ts.map +1 -0
  241. package/dist/cli/output-format.js +51 -0
  242. package/dist/cli/output-format.js.map +1 -0
  243. package/dist/cli/output-utils.d.ts +5 -0
  244. package/dist/cli/output-utils.d.ts.map +1 -0
  245. package/dist/cli/output-utils.js +143 -0
  246. package/dist/cli/output-utils.js.map +1 -0
  247. package/dist/cli/path-utils.d.ts +2 -0
  248. package/dist/cli/path-utils.d.ts.map +1 -0
  249. package/dist/cli/path-utils.js +12 -0
  250. package/dist/cli/path-utils.js.map +1 -0
  251. package/dist/cli/runtime-debug.d.ts +4 -0
  252. package/dist/cli/runtime-debug.d.ts.map +1 -0
  253. package/dist/cli/runtime-debug.js +134 -0
  254. package/dist/cli/runtime-debug.js.map +1 -0
  255. package/dist/cli/server-lookup.d.ts +3 -0
  256. package/dist/cli/server-lookup.d.ts.map +1 -0
  257. package/dist/cli/server-lookup.js +21 -0
  258. package/dist/cli/server-lookup.js.map +1 -0
  259. package/dist/cli/terminal.d.ts +10 -0
  260. package/dist/cli/terminal.d.ts.map +1 -0
  261. package/dist/cli/terminal.js +33 -0
  262. package/dist/cli/terminal.js.map +1 -0
  263. package/dist/cli/timeouts.d.ts +9 -0
  264. package/dist/cli/timeouts.d.ts.map +1 -0
  265. package/dist/cli/timeouts.js +55 -0
  266. package/dist/cli/timeouts.js.map +1 -0
  267. package/dist/cli/tool-cache.d.ts +9 -0
  268. package/dist/cli/tool-cache.d.ts.map +1 -0
  269. package/dist/cli/tool-cache.js +31 -0
  270. package/dist/cli/tool-cache.js.map +1 -0
  271. package/dist/cli/transport-utils.d.ts +3 -0
  272. package/dist/cli/transport-utils.d.ts.map +1 -0
  273. package/dist/cli/transport-utils.js +9 -0
  274. package/dist/cli/transport-utils.js.map +1 -0
  275. package/dist/cli-metadata.d.ts +57 -0
  276. package/dist/cli-metadata.d.ts.map +1 -0
  277. package/dist/cli-metadata.js +92 -0
  278. package/dist/cli-metadata.js.map +1 -0
  279. package/dist/cli.d.ts +10 -0
  280. package/dist/cli.d.ts.map +1 -0
  281. package/dist/cli.js +217 -0
  282. package/dist/cli.js.map +1 -0
  283. package/dist/config/imports/external.d.ts +8 -0
  284. package/dist/config/imports/external.d.ts.map +1 -0
  285. package/dist/config/imports/external.js +231 -0
  286. package/dist/config/imports/external.js.map +1 -0
  287. package/dist/config/imports/paths-utils.d.ts +3 -0
  288. package/dist/config/imports/paths-utils.d.ts.map +1 -0
  289. package/dist/config/imports/paths-utils.js +27 -0
  290. package/dist/config/imports/paths-utils.js.map +1 -0
  291. package/dist/config/imports/paths.d.ts +3 -0
  292. package/dist/config/imports/paths.d.ts.map +1 -0
  293. package/dist/config/imports/paths.js +135 -0
  294. package/dist/config/imports/paths.js.map +1 -0
  295. package/dist/config/imports/shared.d.ts +4 -0
  296. package/dist/config/imports/shared.d.ts.map +1 -0
  297. package/dist/config/imports/shared.js +25 -0
  298. package/dist/config/imports/shared.js.map +1 -0
  299. package/dist/config/path-discovery.d.ts +11 -0
  300. package/dist/config/path-discovery.d.ts.map +1 -0
  301. package/dist/config/path-discovery.js +65 -0
  302. package/dist/config/path-discovery.js.map +1 -0
  303. package/dist/config/read-config.d.ts +9 -0
  304. package/dist/config/read-config.d.ts.map +1 -0
  305. package/dist/config/read-config.js +74 -0
  306. package/dist/config/read-config.js.map +1 -0
  307. package/dist/config-imports.d.ts +7 -0
  308. package/dist/config-imports.d.ts.map +1 -0
  309. package/dist/config-imports.js +8 -0
  310. package/dist/config-imports.js.map +1 -0
  311. package/dist/config-normalize.d.ts +8 -0
  312. package/dist/config-normalize.d.ts.map +1 -0
  313. package/dist/config-normalize.js +184 -0
  314. package/dist/config-normalize.js.map +1 -0
  315. package/dist/config-schema.d.ts +164 -0
  316. package/dist/config-schema.d.ts.map +1 -0
  317. package/dist/config-schema.js +103 -0
  318. package/dist/config-schema.js.map +1 -0
  319. package/dist/config.d.ts +17 -0
  320. package/dist/config.d.ts.map +1 -0
  321. package/dist/config.js +91 -0
  322. package/dist/config.js.map +1 -0
  323. package/dist/daemon/client.d.ts +34 -0
  324. package/dist/daemon/client.d.ts.map +1 -0
  325. package/dist/daemon/client.js +291 -0
  326. package/dist/daemon/client.js.map +1 -0
  327. package/dist/daemon/config-layers.d.ts +7 -0
  328. package/dist/daemon/config-layers.d.ts.map +1 -0
  329. package/dist/daemon/config-layers.js +20 -0
  330. package/dist/daemon/config-layers.js.map +1 -0
  331. package/dist/daemon/host.d.ts +32 -0
  332. package/dist/daemon/host.d.ts.map +1 -0
  333. package/dist/daemon/host.js +345 -0
  334. package/dist/daemon/host.js.map +1 -0
  335. package/dist/daemon/launch.d.ts +10 -0
  336. package/dist/daemon/launch.d.ts.map +1 -0
  337. package/dist/daemon/launch.js +35 -0
  338. package/dist/daemon/launch.js.map +1 -0
  339. package/dist/daemon/log-context.d.ts +18 -0
  340. package/dist/daemon/log-context.d.ts.map +1 -0
  341. package/dist/daemon/log-context.js +64 -0
  342. package/dist/daemon/log-context.js.map +1 -0
  343. package/dist/daemon/paths.d.ts +5 -0
  344. package/dist/daemon/paths.d.ts.map +1 -0
  345. package/dist/daemon/paths.js +30 -0
  346. package/dist/daemon/paths.js.map +1 -0
  347. package/dist/daemon/protocol.d.ts +51 -0
  348. package/dist/daemon/protocol.d.ts.map +1 -0
  349. package/dist/daemon/protocol.js +2 -0
  350. package/dist/daemon/protocol.js.map +1 -0
  351. package/dist/daemon/request-utils.d.ts +12 -0
  352. package/dist/daemon/request-utils.d.ts.map +1 -0
  353. package/dist/daemon/request-utils.js +52 -0
  354. package/dist/daemon/request-utils.js.map +1 -0
  355. package/dist/daemon/runtime-wrapper.d.ts +9 -0
  356. package/dist/daemon/runtime-wrapper.d.ts.map +1 -0
  357. package/dist/daemon/runtime-wrapper.js +110 -0
  358. package/dist/daemon/runtime-wrapper.js.map +1 -0
  359. package/dist/env.d.ts +5 -0
  360. package/dist/env.d.ts.map +1 -0
  361. package/dist/env.js +93 -0
  362. package/dist/env.js.map +1 -0
  363. package/dist/error-classifier.d.ts +11 -0
  364. package/dist/error-classifier.d.ts.map +1 -0
  365. package/dist/error-classifier.js +141 -0
  366. package/dist/error-classifier.js.map +1 -0
  367. package/dist/fs-json.d.ts +3 -0
  368. package/dist/fs-json.d.ts.map +1 -0
  369. package/dist/fs-json.js +21 -0
  370. package/dist/fs-json.js.map +1 -0
  371. package/dist/generate-cli.d.ts +32 -0
  372. package/dist/generate-cli.d.ts.map +1 -0
  373. package/dist/generate-cli.js +155 -0
  374. package/dist/generate-cli.js.map +1 -0
  375. package/dist/index.d.ts +9 -0
  376. package/dist/index.d.ts.map +1 -0
  377. package/dist/index.js +5 -0
  378. package/dist/index.js.map +1 -0
  379. package/dist/lifecycle.d.ts +8 -0
  380. package/dist/lifecycle.d.ts.map +1 -0
  381. package/dist/lifecycle.js +106 -0
  382. package/dist/lifecycle.js.map +1 -0
  383. package/dist/logging.d.ts +19 -0
  384. package/dist/logging.d.ts.map +1 -0
  385. package/dist/logging.js +76 -0
  386. package/dist/logging.js.map +1 -0
  387. package/dist/oauth-manual.d.ts +9 -0
  388. package/dist/oauth-manual.d.ts.map +1 -0
  389. package/dist/oauth-manual.js +84 -0
  390. package/dist/oauth-manual.js.map +1 -0
  391. package/dist/oauth-persistence.d.ts +20 -0
  392. package/dist/oauth-persistence.d.ts.map +1 -0
  393. package/dist/oauth-persistence.js +254 -0
  394. package/dist/oauth-persistence.js.map +1 -0
  395. package/dist/oauth-vault.d.ts +19 -0
  396. package/dist/oauth-vault.d.ts.map +1 -0
  397. package/dist/oauth-vault.js +100 -0
  398. package/dist/oauth-vault.js.map +1 -0
  399. package/dist/oauth.d.ts +31 -0
  400. package/dist/oauth.d.ts.map +1 -0
  401. package/dist/oauth.js +414 -0
  402. package/dist/oauth.js.map +1 -0
  403. package/dist/result-utils.d.ts +22 -0
  404. package/dist/result-utils.d.ts.map +1 -0
  405. package/dist/result-utils.js +229 -0
  406. package/dist/result-utils.js.map +1 -0
  407. package/dist/runtime/errors.d.ts +2 -0
  408. package/dist/runtime/errors.d.ts.map +1 -0
  409. package/dist/runtime/errors.js +16 -0
  410. package/dist/runtime/errors.js.map +1 -0
  411. package/dist/runtime/http-transport.d.ts +15 -0
  412. package/dist/runtime/http-transport.d.ts.map +1 -0
  413. package/dist/runtime/http-transport.js +91 -0
  414. package/dist/runtime/http-transport.js.map +1 -0
  415. package/dist/runtime/manual-oauth.d.ts +8 -0
  416. package/dist/runtime/manual-oauth.d.ts.map +1 -0
  417. package/dist/runtime/manual-oauth.js +81 -0
  418. package/dist/runtime/manual-oauth.js.map +1 -0
  419. package/dist/runtime/oauth.d.ts +22 -0
  420. package/dist/runtime/oauth.d.ts.map +1 -0
  421. package/dist/runtime/oauth.js +83 -0
  422. package/dist/runtime/oauth.js.map +1 -0
  423. package/dist/runtime/transport.d.ts +24 -0
  424. package/dist/runtime/transport.d.ts.map +1 -0
  425. package/dist/runtime/transport.js +165 -0
  426. package/dist/runtime/transport.js.map +1 -0
  427. package/dist/runtime/utils.d.ts +5 -0
  428. package/dist/runtime/utils.d.ts.map +1 -0
  429. package/dist/runtime/utils.js +47 -0
  430. package/dist/runtime/utils.js.map +1 -0
  431. package/dist/runtime-header-utils.d.ts +2 -0
  432. package/dist/runtime-header-utils.d.ts.map +1 -0
  433. package/dist/runtime-header-utils.js +19 -0
  434. package/dist/runtime-header-utils.js.map +1 -0
  435. package/dist/runtime-oauth-support.d.ts +5 -0
  436. package/dist/runtime-oauth-support.d.ts.map +1 -0
  437. package/dist/runtime-oauth-support.js +21 -0
  438. package/dist/runtime-oauth-support.js.map +1 -0
  439. package/dist/runtime-process-utils.d.ts +11 -0
  440. package/dist/runtime-process-utils.d.ts.map +1 -0
  441. package/dist/runtime-process-utils.js +299 -0
  442. package/dist/runtime-process-utils.js.map +1 -0
  443. package/dist/runtime.d.ts +55 -0
  444. package/dist/runtime.d.ts.map +1 -0
  445. package/dist/runtime.js +245 -0
  446. package/dist/runtime.js.map +1 -0
  447. package/dist/schema-cache.d.ts +10 -0
  448. package/dist/schema-cache.d.ts.map +1 -0
  449. package/dist/schema-cache.js +40 -0
  450. package/dist/schema-cache.js.map +1 -0
  451. package/dist/sdk-patches.d.ts +5 -0
  452. package/dist/sdk-patches.d.ts.map +1 -0
  453. package/dist/sdk-patches.js +399 -0
  454. package/dist/sdk-patches.js.map +1 -0
  455. package/dist/server-proxy.d.ts +17 -0
  456. package/dist/server-proxy.d.ts.map +1 -0
  457. package/dist/server-proxy.js +342 -0
  458. package/dist/server-proxy.js.map +1 -0
  459. package/docs/RELEASE.md +96 -0
  460. package/docs/adhoc.md +76 -0
  461. package/docs/call-heuristic.md +31 -0
  462. package/docs/call-syntax.md +75 -0
  463. package/docs/cli-generator.md +116 -0
  464. package/docs/cli-reference.md +76 -0
  465. package/docs/config.md +208 -0
  466. package/docs/daemon.md +95 -0
  467. package/docs/emit-ts.md +98 -0
  468. package/docs/hang-debug.md +88 -0
  469. package/docs/import.md +59 -0
  470. package/docs/known-issues.md +33 -0
  471. package/docs/livetests.md +31 -0
  472. package/docs/local.md +73 -0
  473. package/docs/logging.md +67 -0
  474. package/docs/manual-testing.md +78 -0
  475. package/docs/mcp.md +44 -0
  476. package/docs/migration.md +77 -0
  477. package/docs/pnpm-mcp-migration.md +15 -0
  478. package/docs/refactor.md +76 -0
  479. package/docs/shortcuts.md +31 -0
  480. package/docs/spec.md +86 -0
  481. package/docs/subagent.md +39 -0
  482. package/docs/supabase-auth-issue.md +53 -0
  483. package/docs/tmux.md +30 -0
  484. package/docs/tool-calling.md +73 -0
  485. package/docs/windows.md +25 -0
  486. package/examples/context7-headlines.ts +72 -0
  487. package/git +3 -0
  488. package/mcporter.png +0 -0
  489. package/mcporter.schema.json +263 -0
  490. package/package.json +105 -0
  491. package/pnpm-workspace.yaml +2 -0
  492. package/runner +13 -0
  493. package/scripts/agent-send.ts +179 -0
  494. package/scripts/build-bun.ts +125 -0
  495. package/scripts/committer +53 -0
  496. package/scripts/docs-list.ts +132 -0
  497. package/scripts/generate-json-schema.ts +50 -0
  498. package/scripts/git-policy.ts +165 -0
  499. package/scripts/mcp_signoz_retry_patch.cjs +9 -0
  500. package/scripts/release.sh +86 -0
  501. package/scripts/runner.ts +1556 -0
  502. package/scripts/test-runner.js +39 -0
  503. package/src/cli/adhoc-server.ts +263 -0
  504. package/src/cli/auth-command.ts +290 -0
  505. package/src/cli/call-argument-expression.ts +61 -0
  506. package/src/cli/call-argument-values.ts +95 -0
  507. package/src/cli/call-arguments.ts +246 -0
  508. package/src/cli/call-command.ts +478 -0
  509. package/src/cli/call-expression-parser.ts +210 -0
  510. package/src/cli/cli-factory.ts +51 -0
  511. package/src/cli/command-inference.ts +99 -0
  512. package/src/cli/config/add.ts +308 -0
  513. package/src/cli/config/auth.ts +23 -0
  514. package/src/cli/config/doctor.ts +27 -0
  515. package/src/cli/config/get.ts +47 -0
  516. package/src/cli/config/help.ts +213 -0
  517. package/src/cli/config/import.ts +97 -0
  518. package/src/cli/config/index.ts +1 -0
  519. package/src/cli/config/list.ts +81 -0
  520. package/src/cli/config/remove.ts +20 -0
  521. package/src/cli/config/render.ts +119 -0
  522. package/src/cli/config/shared.ts +159 -0
  523. package/src/cli/config/types.ts +8 -0
  524. package/src/cli/config-command.ts +72 -0
  525. package/src/cli/daemon-command.ts +260 -0
  526. package/src/cli/emit-ts-command.ts +260 -0
  527. package/src/cli/emit-ts-templates.ts +161 -0
  528. package/src/cli/ephemeral-flags.ts +128 -0
  529. package/src/cli/ephemeral-target.ts +134 -0
  530. package/src/cli/errors.ts +6 -0
  531. package/src/cli/flag-utils.ts +29 -0
  532. package/src/cli/generate/artifacts.ts +308 -0
  533. package/src/cli/generate/definition.ts +325 -0
  534. package/src/cli/generate/flag-parser.ts +50 -0
  535. package/src/cli/generate/flags.ts +248 -0
  536. package/src/cli/generate/fs-helpers.ts +34 -0
  537. package/src/cli/generate/name-utils.ts +176 -0
  538. package/src/cli/generate/output.ts +27 -0
  539. package/src/cli/generate/runtime.ts +38 -0
  540. package/src/cli/generate/server-utils.ts +38 -0
  541. package/src/cli/generate/template-data.ts +126 -0
  542. package/src/cli/generate/template-help.ts +112 -0
  543. package/src/cli/generate/template.ts +407 -0
  544. package/src/cli/generate/tools.ts +354 -0
  545. package/src/cli/generate/types.ts +1 -0
  546. package/src/cli/generate-cli-runner.ts +82 -0
  547. package/src/cli/help-output.ts +207 -0
  548. package/src/cli/http-utils.ts +89 -0
  549. package/src/cli/identifier-helpers.ts +107 -0
  550. package/src/cli/image-output.ts +62 -0
  551. package/src/cli/inspect-cli-command.ts +89 -0
  552. package/src/cli/json-output.ts +60 -0
  553. package/src/cli/list-command.ts +432 -0
  554. package/src/cli/list-detail-helpers.ts +179 -0
  555. package/src/cli/list-doc-comments.ts +129 -0
  556. package/src/cli/list-format.ts +150 -0
  557. package/src/cli/list-output.ts +224 -0
  558. package/src/cli/list-signature.ts +217 -0
  559. package/src/cli/logger-context.ts +36 -0
  560. package/src/cli/output-format.ts +63 -0
  561. package/src/cli/output-utils.ts +161 -0
  562. package/src/cli/path-utils.ts +13 -0
  563. package/src/cli/runtime-debug.ts +141 -0
  564. package/src/cli/server-lookup.ts +22 -0
  565. package/src/cli/terminal.ts +41 -0
  566. package/src/cli/timeouts.ts +67 -0
  567. package/src/cli/tool-cache.ts +43 -0
  568. package/src/cli/transport-utils.ts +10 -0
  569. package/src/cli-metadata.ts +164 -0
  570. package/src/cli.ts +234 -0
  571. package/src/config/imports/external.ts +284 -0
  572. package/src/config/imports/paths-utils.ts +29 -0
  573. package/src/config/imports/paths.ts +145 -0
  574. package/src/config/imports/shared.ts +27 -0
  575. package/src/config/path-discovery.ts +79 -0
  576. package/src/config/read-config.ts +91 -0
  577. package/src/config-imports.ts +12 -0
  578. package/src/config-normalize.ts +220 -0
  579. package/src/config-schema.ts +175 -0
  580. package/src/config.ts +136 -0
  581. package/src/daemon/client.ts +350 -0
  582. package/src/daemon/config-layers.ts +23 -0
  583. package/src/daemon/host.ts +455 -0
  584. package/src/daemon/launch.ts +45 -0
  585. package/src/daemon/log-context.ts +78 -0
  586. package/src/daemon/paths.ts +35 -0
  587. package/src/daemon/protocol.ts +57 -0
  588. package/src/daemon/request-utils.ts +67 -0
  589. package/src/daemon/runtime-wrapper.ts +135 -0
  590. package/src/env.ts +107 -0
  591. package/src/error-classifier.ts +158 -0
  592. package/src/fs-json.ts +21 -0
  593. package/src/generate-cli.ts +211 -0
  594. package/src/index.ts +14 -0
  595. package/src/lifecycle.ts +138 -0
  596. package/src/logging.ts +93 -0
  597. package/src/oauth-manual.ts +103 -0
  598. package/src/oauth-persistence.ts +316 -0
  599. package/src/oauth-vault.ts +128 -0
  600. package/src/oauth.ts +494 -0
  601. package/src/result-utils.ts +278 -0
  602. package/src/runtime/errors.ts +17 -0
  603. package/src/runtime/oauth.ts +112 -0
  604. package/src/runtime/transport.ts +198 -0
  605. package/src/runtime/utils.ts +54 -0
  606. package/src/runtime-header-utils.ts +23 -0
  607. package/src/runtime-oauth-support.ts +24 -0
  608. package/src/runtime-process-utils.ts +324 -0
  609. package/src/runtime.ts +321 -0
  610. package/src/schema-cache.ts +49 -0
  611. package/src/sdk-patches.ts +498 -0
  612. package/src/server-proxy.ts +407 -0
  613. package/tests/adhoc-server.test.ts +49 -0
  614. package/tests/call-arguments.test.ts +111 -0
  615. package/tests/cli-auth-help.test.ts +43 -0
  616. package/tests/cli-auth-retry.test.ts +41 -0
  617. package/tests/cli-auth.test.ts +96 -0
  618. package/tests/cli-call-args.test.ts +69 -0
  619. package/tests/cli-call-errors.test.ts +27 -0
  620. package/tests/cli-call-execution.test.ts +279 -0
  621. package/tests/cli-call-help.test.ts +43 -0
  622. package/tests/cli-command-inference.test.ts +73 -0
  623. package/tests/cli-config-command.test.ts +371 -0
  624. package/tests/cli-config-fallback.test.ts +259 -0
  625. package/tests/cli-config-routing.test.ts +20 -0
  626. package/tests/cli-ephemeral-flags.test.ts +54 -0
  627. package/tests/cli-flag-utils.test.ts +17 -0
  628. package/tests/cli-generate-artifacts.test.ts +52 -0
  629. package/tests/cli-generate-cli.integration.test.ts +675 -0
  630. package/tests/cli-generate-runner.test.ts +156 -0
  631. package/tests/cli-global-flags.test.ts +61 -0
  632. package/tests/cli-help-shortcuts.test.ts +42 -0
  633. package/tests/cli-image-output.test.ts +65 -0
  634. package/tests/cli-inspect-command.test.ts +15 -0
  635. package/tests/cli-list-classification.test.ts +291 -0
  636. package/tests/cli-list-flags.test.ts +83 -0
  637. package/tests/cli-list-formatting.test.ts +358 -0
  638. package/tests/cli-list-help.test.ts +43 -0
  639. package/tests/cli-list-json.test.ts +55 -0
  640. package/tests/cli-list-stdio-logs.test.ts +108 -0
  641. package/tests/cli-list-verbose-e2e.test.ts +83 -0
  642. package/tests/cli-oauth-timeout-flag.test.ts +94 -0
  643. package/tests/cli-output-utils.test.ts +129 -0
  644. package/tests/cli-regenerate.test.ts +261 -0
  645. package/tests/cli-version.test.ts +24 -0
  646. package/tests/config-add-dry-run.test.ts +45 -0
  647. package/tests/config-add-flags.test.ts +61 -0
  648. package/tests/config-add-imports.test.ts +28 -0
  649. package/tests/config-add-persist.test.ts +27 -0
  650. package/tests/config-add-scope-behavior.test.ts +46 -0
  651. package/tests/config-add-scope.test.ts +101 -0
  652. package/tests/config-add-sse.test.ts +23 -0
  653. package/tests/config-command-string.test.ts +96 -0
  654. package/tests/config-doctor.test.ts +45 -0
  655. package/tests/config-get-json.test.ts +24 -0
  656. package/tests/config-import-dedupe.test.ts +27 -0
  657. package/tests/config-import-paths.test.ts +49 -0
  658. package/tests/config-import.test.ts +64 -0
  659. package/tests/config-imports-unit.test.ts +337 -0
  660. package/tests/config-imports.test.ts +417 -0
  661. package/tests/config-layered.test.ts +178 -0
  662. package/tests/config-list-text-footer.test.ts +33 -0
  663. package/tests/config-list.test.ts +62 -0
  664. package/tests/config-missing.test.ts +140 -0
  665. package/tests/config-normalize.test.ts +71 -0
  666. package/tests/config-remove.test.ts +44 -0
  667. package/tests/config-render.test.ts +61 -0
  668. package/tests/config-resolution.test.ts +94 -0
  669. package/tests/config-schema-file.test.ts +29 -0
  670. package/tests/config-shared.test.ts +41 -0
  671. package/tests/config-sources.test.ts +58 -0
  672. package/tests/daemon-cli-command.test.ts +112 -0
  673. package/tests/daemon-client-config-stale.test.ts +222 -0
  674. package/tests/daemon-client-timeout.test.ts +114 -0
  675. package/tests/daemon-client.test.ts +61 -0
  676. package/tests/daemon-host.test.ts +33 -0
  677. package/tests/daemon.integration.test.ts +175 -0
  678. package/tests/emit-ts.test.ts +125 -0
  679. package/tests/ephemeral-target.test.ts +26 -0
  680. package/tests/error-classifier.test.ts +46 -0
  681. package/tests/fixtures/ansi.ts +18 -0
  682. package/tests/fixtures/cli-list-fixtures.ts +43 -0
  683. package/tests/fixtures/config-fixture.ts +29 -0
  684. package/tests/fixtures/imports/.claude/mcp.json +8 -0
  685. package/tests/fixtures/imports/.claude/settings.json +10 -0
  686. package/tests/fixtures/imports/.claude/settings.local.json +10 -0
  687. package/tests/fixtures/imports/.codeium/windsurf/mcp_config.json +14 -0
  688. package/tests/fixtures/imports/.codex/config.toml +7 -0
  689. package/tests/fixtures/imports/.config/opencode/opencode.jsonc +10 -0
  690. package/tests/fixtures/imports/.cursor/mcp.json +14 -0
  691. package/tests/fixtures/imports/Library/Application Support/Code/User/mcp.json +11 -0
  692. package/tests/fixtures/imports/config/mcporter.json +11 -0
  693. package/tests/fixtures/imports/home/.claude/settings.json +7 -0
  694. package/tests/fixtures/imports/home/.codeium/windsurf/mcp_config.json +14 -0
  695. package/tests/fixtures/imports/home/.codex/config.toml +7 -0
  696. package/tests/fixtures/imports/home/Library/Application Support/Code/User/mcp.json +11 -0
  697. package/tests/fixtures/imports/opencode.jsonc +11 -0
  698. package/tests/fixtures/mcporter.json +64 -0
  699. package/tests/fixtures/stdio-filesystem-server.mjs +63 -0
  700. package/tests/fixtures/stdio-memory-server.mjs +58 -0
  701. package/tests/fixtures/test-helpers.ts +24 -0
  702. package/tests/fixtures/tool-fixtures.ts +35 -0
  703. package/tests/fs-json.test.ts +35 -0
  704. package/tests/generate-cli-helpers.test.ts +162 -0
  705. package/tests/generate-cli.test.ts +595 -0
  706. package/tests/generate-definition.test.ts +25 -0
  707. package/tests/generator-flag-parser.test.ts +19 -0
  708. package/tests/index-api.test.ts +136 -0
  709. package/tests/keep-alive-runtime.test.ts +152 -0
  710. package/tests/lifecycle.test.ts +29 -0
  711. package/tests/list-detail-helpers.test.ts +204 -0
  712. package/tests/list-format.test.ts +40 -0
  713. package/tests/list-inline-stdio.test.ts +71 -0
  714. package/tests/list-output.test.ts +138 -0
  715. package/tests/live/deepwiki-live.test.ts +53 -0
  716. package/tests/oauth-callback.test.ts +108 -0
  717. package/tests/oauth-open-external.test.ts +29 -0
  718. package/tests/oauth-persistence.test.ts +146 -0
  719. package/tests/oauth-session.test.ts +216 -0
  720. package/tests/result-utils.test.ts +254 -0
  721. package/tests/runtime-call-timeout.test.ts +75 -0
  722. package/tests/runtime-compose.test.ts +298 -0
  723. package/tests/runtime-error-reset.test.ts +65 -0
  724. package/tests/runtime-header-utils.test.ts +36 -0
  725. package/tests/runtime-integration.test.ts +113 -0
  726. package/tests/runtime-oauth-connect.test.ts +72 -0
  727. package/tests/runtime-oauth-detection.test.ts +72 -0
  728. package/tests/runtime-oauth-timeout.test.ts +60 -0
  729. package/tests/runtime-oauth-utils.test.ts +14 -0
  730. package/tests/runtime-process-utils.test.ts +53 -0
  731. package/tests/runtime-transport.test.ts +69 -0
  732. package/tests/runtime-utils.test.ts +31 -0
  733. package/tests/runtime.test.ts +94 -0
  734. package/tests/sdk-patches.test.ts +24 -0
  735. package/tests/server-proxy.test.ts +336 -0
  736. package/tests/stdio-servers.integration.test.ts +139 -0
  737. package/tests/tool-cache.test.ts +42 -0
  738. package/tests/version-consistency.test.ts +11 -0
  739. package/tsconfig.build.json +11 -0
  740. package/tsconfig.json +17 -0
  741. package/vitest.config.ts +18 -0
package/README.md ADDED
@@ -0,0 +1,449 @@
1
+ # MCPorter 🧳 - Call MCPs from TypeScript or as CLI
2
+ <p align="center">
3
+ <img src="https://raw.githubusercontent.com/steipete/mcporter/main/mcporter.png" alt="MCPorter header banner" width="1100">
4
+ </p>
5
+
6
+ <p align="center">
7
+ <a href="https://www.npmjs.com/package/@nimrobo/mcporter-remote"><img src="https://img.shields.io/npm/v/@nimrobo/mcporter-remote?style=for-the-badge&logo=npm&logoColor=white" alt="npm version"></a>
8
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="MIT License"></a>
9
+ </p>
10
+
11
+ > **This is a Nimrobo fork of [steipete/mcporter](https://github.com/steipete/mcporter).** Published as [`@nimrobo/mcporter-remote`](https://www.npmjs.com/package/@nimrobo/mcporter-remote). It adds support for remote (browser-less) OAuth flows on dev boxes and remote pods.
12
+
13
+ _TypeScript runtime, CLI, and code-generation toolkit for the Model Context Protocol._
14
+
15
+ MCPorter helps you lean into the "code execution" workflows highlighted in Anthropic's **Code Execution with MCP** guidance: discover the MCP servers already configured on your system, call them directly, compose richer automations in TypeScript, and mint single-purpose CLIs when you need to share a tool. All of that works out of the box -- no boilerplate, no schema spelunking.
16
+
17
+ ## Key Capabilities
18
+
19
+ - **Zero-config discovery.** `createRuntime()` merges your home config (`~/.mcporter/mcporter.json[c]`) first, then `config/mcporter.json`, plus Cursor/Claude/Codex/Windsurf/OpenCode/VS Code imports, expands `${ENV}` placeholders, and pools connections so you can reuse transports across multiple calls.
20
+ - **One-command CLI generation.** `mcporter generate-cli` turns any MCP server definition into a ready-to-run CLI, with optional bundling/compilation and metadata for easy regeneration.
21
+ - **Typed tool clients.** `mcporter emit-ts` emits `.d.ts` interfaces or ready-to-run client wrappers so agents/tests can call MCP servers with strong TypeScript types without hand-writing plumbing.
22
+ - **Friendly composable API.** `createServerProxy()` exposes tools as ergonomic camelCase methods, automatically applies JSON-schema defaults, validates required arguments, and hands back a `CallResult` with `.text()`, `.markdown()`, `.json()`, `.images()`, and `.content()` helpers.
23
+ - **OAuth and stdio ergonomics.** Built-in OAuth caching, log tailing, and stdio wrappers let you work with HTTP, SSE, and stdio transports from the same interface.
24
+ - **Ad-hoc connections.** Point the CLI at *any* MCP endpoint (HTTP or stdio) without touching config, then persist it later if you want. Hosted MCPs that expect a browser login (Supabase, Vercel, etc.) are auto-detected—just run `mcporter auth <url>` and the CLI promotes the definition to OAuth on the fly. See [docs/adhoc.md](docs/adhoc.md).
25
+
26
+ ## Installation
27
+
28
+ ```bash
29
+ # Install globally
30
+ npm install -g @nimrobo/mcporter-remote
31
+
32
+ # Or run without installing
33
+ npx @nimrobo/mcporter-remote list
34
+ ```
35
+
36
+ After global install the CLI is available as `mcporter`.
37
+
38
+ ## Quick Start
39
+
40
+ MCPorter auto-discovers the MCP servers you already configured in Cursor, Claude Code/Desktop, Codex, or local overrides. You can try it immediately with `npx`--no installation required. Need a full command reference (flags, modes, return types)? Check out [docs/cli-reference.md](docs/cli-reference.md).
41
+ ### Call syntax options
42
+
43
+ ```bash
44
+ # Colon-delimited flags (shell-friendly)
45
+ npx mcporter call linear.create_comment issueId:ENG-123 body:'Looks good!'
46
+
47
+ # Function-call style (matches signatures from `mcporter list`)
48
+ npx mcporter call 'linear.create_comment(issueId: "ENG-123", body: "Looks good!")'
49
+ ```
50
+
51
+
52
+ ### List your MCP servers
53
+
54
+ ```bash
55
+ npx mcporter list
56
+ npx mcporter list context7 --schema
57
+ npx mcporter list https://mcp.linear.app/mcp --all-parameters
58
+ npx mcporter list shadcn.io/api/mcp.getComponents # URL + tool suffix auto-resolves
59
+ npx mcporter list --stdio "bun run ./local-server.ts" --env TOKEN=xyz
60
+ ```
61
+
62
+ - Add `--json` to emit a machine-readable summary with per-server statuses (auth/offline/http/error counts) and, for single-server runs, the full tool schema payload.
63
+ - Add `--verbose` to show every config source that registered the server name (primary first), both in text and JSON list output.
64
+
65
+ You can now point `mcporter list` at ad-hoc servers: provide a URL directly or use the new `--http-url/--stdio` flags (plus `--env`, `--cwd`, `--name`, or `--persist`) to describe any MCP endpoint. Until you persist that definition, you still need to repeat the same URL/stdio flags for `mcporter call`—the printed slug only becomes reusable once you merge it into a config via `--persist` or `mcporter config add` (use `--scope home|project` to pick the write target). Follow up with `mcporter auth https://…` (or the same flag set) to finish OAuth without editing config. Full details live in [docs/adhoc.md](docs/adhoc.md).
66
+
67
+ Single-server listings now read like a TypeScript header file so you can copy/paste the signature straight into `mcporter call`:
68
+
69
+ ```ts
70
+ linear - Hosted Linear MCP; exposes issue search, create, and workflow tooling.
71
+ 23 tools · 1654ms · HTTP https://mcp.linear.app/mcp
72
+
73
+ /**
74
+ * Create a comment on a specific Linear issue
75
+ * @param issueId The issue ID
76
+ * @param body The content of the comment as Markdown
77
+ * @param parentId? A parent comment ID to reply to
78
+ */
79
+ function create_comment(issueId: string, body: string, parentId?: string);
80
+ // optional (3): notifySubscribers, labelIds, mentionIds
81
+
82
+ /**
83
+ * List documents in the user's Linear workspace
84
+ * @param query? An optional search query
85
+ * @param projectId? Filter by project ID
86
+ */
87
+ function list_documents(query?: string, projectId?: string);
88
+ // optional (11): limit, before, after, orderBy, initiativeId, ...
89
+ ```
90
+
91
+ Here’s what that looks like for Vercel when you run `npx mcporter list vercel`:
92
+
93
+ ```ts
94
+ vercel - Vercel MCP (requires OAuth).
95
+
96
+ /**
97
+ * Search the Vercel documentation.
98
+ * Use this tool to answer any questions about Vercel’s platform, features, and best practices,
99
+ * including:
100
+ * - Core Concepts: Projects, Deployments, Git Integration, Preview Deployments, Environments
101
+ * - Frontend & Frameworks: Next.js, SvelteKit, Nuxt, Astro, Remix, frameworks configuration and
102
+ * optimization
103
+ * - APIs: REST API, Vercel SDK, Build Output API
104
+ * - Compute: Fluid Compute, Functions, Routing Middleware, Cron Jobs, OG Image Generation, Sandbox,
105
+ * Data Cache
106
+ * - AI: Vercel AI SDK, AI Gateway, MCP, v0
107
+ * - Performance & Delivery: Edge Network, Caching, CDN, Image Optimization, Headers, Redirects,
108
+ * Rewrites
109
+ * - Pricing: Plans, Spend Management, Billing
110
+ * - Security: Audit Logs, Firewall, Bot Management, BotID, OIDC, RBAC, Secure Compute, 2FA
111
+ * - Storage: Blog, Edge Config
112
+ *
113
+ * @param topic Topic to focus the documentation search on (e.g., 'routing', 'data-fetching').
114
+ * @param tokens? Maximum number of tokens to include in the result. Default is 2500.
115
+ */
116
+ function search_vercel_documentation(topic: string, tokens?: number);
117
+
118
+ /**
119
+ * Deploy the current project to Vercel
120
+ */
121
+ function deploy_to_vercel();
122
+ ```
123
+
124
+ Required parameters always show; optional parameters stay hidden unless (a) there are only one or two of them alongside fewer than four required fields or (b) you pass `--all-parameters`. Whenever MCPorter hides parameters it prints `Optional parameters hidden; run with --all-parameters to view all fields.` so you know how to reveal the full signature. Return types are inferred from the tool schema’s `title`, falling back to omitting the suffix entirely instead of guessing.
125
+
126
+ ### Context7: fetch docs (no auth required)
127
+
128
+ ```bash
129
+ npx mcporter call context7.resolve-library-id libraryName=react
130
+ npx mcporter call context7.get-library-docs context7CompatibleLibraryID=/websites/react_dev topic=hooks
131
+ ```
132
+
133
+ ### Linear: search documentation (requires `LINEAR_API_KEY`)
134
+
135
+ ```bash
136
+ LINEAR_API_KEY=sk_linear_example npx mcporter call linear.search_documentation query="automations"
137
+ ```
138
+
139
+ ### Chrome DevTools: snapshot the current tab
140
+
141
+ ```bash
142
+ npx mcporter call chrome-devtools.take_snapshot
143
+ npx mcporter call 'linear.create_comment(issueId: "LNR-123", body: "Hello world")'
144
+ npx mcporter call https://mcp.linear.app/mcp.list_issues assignee=me
145
+ npx mcporter call shadcn.io/api/mcp.getComponent component=vortex # protocol optional; defaults to https
146
+ npx mcporter call linear.listIssues --tool listIssues # auto-corrects to list_issues
147
+ npx mcporter linear.list_issues # shorthand: infers `call`
148
+ VERCEL_ACCESS_TOKEN=sk_vercel_example npx mcporter call "npx -y vercel-domains-mcp" domain=answeroverflow.com # quoted stdio cmd + single-tool inference
149
+ ```
150
+
151
+ > Tool calls understand a JavaScript-like call syntax, auto-correct near-miss tool names, and emit richer inline usage hints. See [docs/call-syntax.md](docs/call-syntax.md) for the grammar and [docs/call-heuristic.md](docs/call-heuristic.md) for the auto-correction rules.
152
+
153
+ Helpful flags:
154
+
155
+ - `--config <path>` -- custom config file (defaults to `./config/mcporter.json`).
156
+ - `--root <path>` -- working directory for stdio commands.
157
+ - `--log-level <debug|info|warn|error>` -- adjust verbosity (respects `MCPORTER_LOG_LEVEL`).
158
+ - `--oauth-timeout <ms>` -- shorten/extend the OAuth browser wait; same as `MCPORTER_OAUTH_TIMEOUT_MS` / `MCPORTER_OAUTH_TIMEOUT`.
159
+ - `--tail-log` -- stream the last 20 lines of any log files referenced by the tool response.
160
+ - `--output <format>` or `--raw` -- control formatted output (defaults to pretty-printed auto detection).
161
+ - `--save-images <dir>` (on `mcporter call`) -- save MCP image content blocks to files in the given directory (opt-in; stdout output shape stays unchanged).
162
+ - `--raw-strings` (on `mcporter call`) -- keep numeric-looking argument values (for `key=value`, `key:value`, and trailing positional values) as strings.
163
+ - `--no-coerce` (on `mcporter call`) -- keep all `key=value` and positional values as raw strings (disables bool/null/number/JSON coercion).
164
+ - `--json` (on `mcporter list`) -- emit JSON summaries/counts instead of text. Multi-server runs report per-server statuses, counts, and connection issues; single-server runs include the full tool metadata.
165
+ - `--output json/raw` (on `mcporter call`) -- when a connection fails, MCPorter prints the usual colorized hint and also emits a structured `{ server, tool, issue }` envelope so scripts can handle auth/offline/http errors programmatically.
166
+ - `--json` (on `mcporter auth`) -- emit the same structured connection envelope whenever OAuth/transport setup fails, instead of throwing an error.
167
+ - `--json` (on `mcporter emit-ts`) -- print a JSON summary describing the emitted files (mode + output paths) instead of text logs—handy when generating artifacts inside scripts.
168
+ - `--all-parameters` -- show every schema field when listing a server (default output shows at least five parameters plus a summary of the rest).
169
+ - `--http-url <https://…>` / `--stdio "command …"` -- describe an ad-hoc MCP server inline. STDIO transports now inherit your current shell environment automatically; add `--env KEY=value` only when you need to inject/override variables alongside `--cwd`, `--name`, or `--persist <config.json>`. These flags now work with `mcporter auth` too, so `mcporter auth https://mcp.example.com/mcp` just works.
170
+ - For OAuth-protected servers such as `vercel`, run `npx mcporter auth vercel` once to complete login.
171
+
172
+ > Tip: You can skip the verb entirely—`mcporter firecrawl` automatically runs `mcporter list firecrawl`, and dotted tokens like `mcporter linear.list_issues` dispatch to the call command (typo fixes included).
173
+
174
+ Timeouts default to 30 s; override with `MCPORTER_LIST_TIMEOUT` or `MCPORTER_CALL_TIMEOUT` when you expect slow startups. OAuth browser handshakes get a separate 60 s grace period; pass `--oauth-timeout <ms>` (or export `MCPORTER_OAUTH_TIMEOUT_MS`) when you need the CLI to bail out faster while you diagnose stubborn auth flows.
175
+
176
+ ### Try an MCP without editing config
177
+
178
+ ```bash
179
+ # Point at an HTTPS MCP server directly
180
+ npx mcporter list --http-url https://mcp.linear.app/mcp --name linear
181
+
182
+ # Run a local stdio MCP server via Bun
183
+ npx mcporter call --stdio "bun run ./local-server.ts" --name local-tools
184
+ ```
185
+
186
+ - Add `--persist config/mcporter.local.json` to save the inferred definition for future runs.
187
+ - Use `--allow-http` if you truly need to hit a cleartext endpoint.
188
+ - See [docs/adhoc.md](docs/adhoc.md) for a deep dive (env overrides, cwd, OAuth).
189
+
190
+ ### Keep MCP servers warm with the daemon
191
+
192
+ - `chrome-devtools`, `mobile-mcp`, and other stateful stdio servers auto-start a per-login daemon the first time you call them so Chrome tabs and device sessions stay alive between agents.
193
+ - Use `mcporter daemon status` to check whether the daemon is running (and which servers are connected).
194
+ - Stop it anytime with `mcporter daemon stop`, pre-warm with `mcporter daemon start`, or bounce it via `mcporter daemon restart` after tweaking configs/env.
195
+ - All other servers stay ephemeral; add `"lifecycle": "keep-alive"` to a server entry (or set `MCPORTER_KEEPALIVE=name`) when you want the daemon to manage it. You can also set `"lifecycle": "ephemeral"` (or `MCPORTER_DISABLE_KEEPALIVE=name`) to opt out.
196
+ - The daemon only manages named servers that come from your config/imports. Ad-hoc STDIO/HTTP targets invoked via `--stdio …`, `--http-url …`, or inline function-call syntax remain per-process today; persist them into `config/mcporter.json` (or use `--persist`) if you need them to participate in the shared daemon.
197
+ - Troubleshooting? Run `mcporter daemon start --log` (or `--log-file /tmp/daemon.log`) to tee stdout/stderr into a file, and add `--log-servers chrome-devtools` when you only want call traces for a specific MCP. Per-server configs can also set `"logging": { "daemon": { "enabled": true } }` to force detailed logging for that entry.
198
+
199
+
200
+ ## Friendlier Tool Calls
201
+
202
+ - **Function-call syntax.** Instead of juggling `--flag value`, you can call tools as `mcporter call 'linear.create_issue(title: "Bug", team: "ENG")'`. The parser supports nested objects/arrays, lets you omit labels when you want to rely on schema order (e.g. `mcporter 'context7.resolve-library-id("react")'`), and surfaces schema validation errors clearly. Deep dive in [docs/call-syntax.md](docs/call-syntax.md).
203
+ - **Flag shorthand still works.** Prefer CLI-style arguments? Stick with `mcporter linear.create_issue title=value team=value`, `title=value`, `title:value`, or even `title: value`—the CLI now normalizes all three forms.
204
+ - **Cheatsheet.** See [docs/tool-calling.md](docs/tool-calling.md) for a quick comparison of every supported call style (auto-inferred verbs, flags, function-calls, and ad-hoc URLs).
205
+ - **Auto-correct.** If you typo a tool name, MCPorter inspects the server’s tool catalog, retries when the edit distance is tiny, and otherwise prints a `Did you mean …?` hint. The heuristic (and how to tune it) is captured in [docs/call-heuristic.md](docs/call-heuristic.md).
206
+ - **Richer single-server output.** `mcporter list <server>` now prints TypeScript-style signatures, inline comments, return-shape hints, and command examples that mirror the new call syntax. Optional parameters stay hidden by default—add `--all-parameters` or `--schema` whenever you need the full JSON schema.
207
+
208
+
209
+ ## Installation
210
+
211
+ ### Run instantly with `npx`
212
+
213
+ ```bash
214
+ npx mcporter list
215
+ ```
216
+
217
+ ### Add to your project
218
+
219
+ ```bash
220
+ pnpm add mcporter
221
+ ```
222
+
223
+ ### Homebrew (steipete/tap)
224
+
225
+ ```bash
226
+ brew tap steipete/tap
227
+ brew install steipete/tap/mcporter
228
+ ```
229
+
230
+ > The tap publishes alongside MCPorter 0.3.2. If you run into issues with an older tap install, run `brew update` before reinstalling.
231
+
232
+ ## One-shot calls from code
233
+
234
+ ```ts
235
+ import { callOnce } from "mcporter";
236
+
237
+ const result = await callOnce({
238
+ server: "firecrawl",
239
+ toolName: "crawl",
240
+ args: { url: "https://anthropic.com" },
241
+ });
242
+
243
+ console.log(result); // raw MCP envelope
244
+ ```
245
+
246
+ `callOnce` automatically discovers the selected server (including Cursor/Claude/Codex/Windsurf/OpenCode/VS Code imports), handles OAuth prompts, and closes transports when it finishes. It is ideal for manual runs or wiring MCPorter directly into an agent tool hook.
247
+
248
+ ## Compose Automations with the Runtime
249
+
250
+ ```ts
251
+ import { createRuntime } from "mcporter";
252
+
253
+ const runtime = await createRuntime();
254
+
255
+ const tools = await runtime.listTools("context7");
256
+ const result = await runtime.callTool("context7", "resolve-library-id", {
257
+ args: { libraryName: "react" },
258
+ });
259
+
260
+ console.log(result); // prints JSON/text automatically because the CLI pretty-prints by default
261
+ await runtime.close(); // shuts down transports and OAuth sessions
262
+ ```
263
+
264
+ Reach for `createRuntime()` when you need connection pooling, repeated calls, or advanced options such as explicit timeouts and log streaming. The runtime reuses transports, refreshes OAuth tokens, and only tears everything down when you call `runtime.close()`.
265
+
266
+ ## Compose Tools in Code
267
+
268
+ The runtime API is built for agents and scripts, not just humans at a terminal.
269
+
270
+ ```ts
271
+ import { createRuntime, createServerProxy } from "mcporter";
272
+
273
+ const runtime = await createRuntime();
274
+ const chrome = createServerProxy(runtime, "chrome-devtools");
275
+ const linear = createServerProxy(runtime, "linear");
276
+
277
+ const snapshot = await chrome.takeSnapshot();
278
+ console.log(snapshot.text());
279
+
280
+ const docs = await linear.searchDocumentation({
281
+ query: "automations",
282
+ page: 0,
283
+ });
284
+ console.log(docs.json());
285
+ ```
286
+
287
+ Friendly ergonomics baked into the proxy and result helpers:
288
+
289
+ - Property names map from camelCase to kebab-case tool names (`takeSnapshot` -> `take_snapshot`).
290
+ - Positional arguments map onto schema-required fields automatically, and option objects respect JSON-schema defaults.
291
+ - Results are wrapped in a `CallResult`, so you can choose `.text()`, `.markdown()`, `.json()`, `.images()`, `.content()`, or access `.raw` when you need the full envelope.
292
+
293
+ Drop down to `runtime.callTool()` whenever you need explicit control over arguments, metadata, or streaming options.
294
+
295
+
296
+ Call `mcporter list <server>` any time you need the TypeScript-style signature, optional parameter hints, and sample invocations that match the CLI's function-call syntax.
297
+
298
+ ## Generate a Standalone CLI
299
+
300
+ Turn any server definition into a shareable CLI artifact:
301
+
302
+ ```bash
303
+ npx mcporter generate-cli \
304
+ --command https://mcp.context7.com/mcp
305
+
306
+ # Outputs:
307
+ # context7.ts (TypeScript template with embedded schemas)
308
+ # context7.js (bundled CLI via Rolldown or Bun, depending on runtime)
309
+ ```
310
+
311
+ > Convert the chrome-devtools MCP to a CLI via this one weird trick:
312
+ >
313
+ > `npx mcporter generate-cli --command "npx -y chrome-devtools-mcp@latest"`
314
+
315
+ Tip: you can drop `--command` when the inline command is the first positional argument (e.g., `npx mcporter generate-cli "npx -y chrome-devtools-mcp@latest"`).
316
+
317
+ - `--name` overrides the inferred CLI name.
318
+ - Add `--description "..."` if you want a custom summary in the generated help output (otherwise mcporter asks the MCP server for its own description/title during generation).
319
+ - Generated CLIs inherit the same color-aware help layout as `mcporter` itself: invoking the binary with no arguments shows the embedded tool list + quick start, and each `--help` page uses bold titles + dimmed descriptions when stdout is a TTY.
320
+ - Add `--bundle [path]` to emit a bundle alongside the template (Rolldown when targeting Node, Bun automatically when the runtime resolves to Bun; override with `--bundler rolldown|bun`).
321
+ - `--output <path>` writes the template somewhere specific.
322
+ - `--runtime bun|node` picks the runtime for generated code (Bun required for `--compile`).
323
+ - Add `--compile` to emit a Bun-compiled binary; MCPorter cleans up intermediate bundles when you omit `--bundle`.
324
+ - Use `--include-tools a,b,c` or `--exclude-tools a,b,c` to generate a CLI for a subset of tools (mutually exclusive).
325
+ - Use `--from <artifact>` (optionally `--dry-run`) to regenerate an existing CLI using its embedded metadata.
326
+ - Prefer a positional shorthand if the server already lives in your config/imports:
327
+ `npx mcporter generate-cli linear --bundle dist/linear.js`.
328
+ - `--server`/`--command` accept HTTP URLs, optional `.tool` suffixes, and even scheme-less hosts (`shadcn.io/api/mcp.getComponents`).
329
+
330
+ Every artifact embeds regeneration metadata (generator version, resolved server definition, invocation flags). Use:
331
+
332
+ ```
333
+ npx mcporter inspect-cli dist/context7.js # human-readable summary
334
+ npx mcporter generate-cli --from dist/context7.js # replay with latest mcporter
335
+ ```
336
+
337
+ ## Generate Typed Clients
338
+
339
+ Use `mcporter emit-ts` when you want strongly typed tooling without shipping a full CLI. It reuses the same signatures/doc blocks as `mcporter list`, so the generated headers stay in sync with what the CLI shows.
340
+
341
+ ```bash
342
+ # Types-only interface (Promise signatures)
343
+ npx mcporter emit-ts linear --out types/linear-tools.d.ts
344
+
345
+ # Client wrapper (creates a reusable proxy factory alongside the .d.ts)
346
+ npx mcporter emit-ts linear --mode client --out clients/linear.ts
347
+ ```
348
+
349
+ - `--mode types` (default) produces a `.d.ts` interface you can import anywhere.
350
+ - `--mode client` emits the `.d.ts` **and** a `.ts` helper that wraps `createRuntime` / `createServerProxy` for you.
351
+ - Add `--include-optional` whenever you want every optional field spelled out (mirrors `mcporter list --all-parameters`).
352
+ - Add `--json` to emit a structured summary (mode plus output paths) instead of plain-text logs when scripting `emit-ts`.
353
+ - The `<server>` argument also understands HTTP URLs and selectors with `.tool` suffixes or missing protocols—mirroring the main CLI.
354
+
355
+ See [docs/emit-ts.md](docs/emit-ts.md) for the full flag reference plus inline snapshots of the emitted files.
356
+
357
+ ## Configuration Reference
358
+
359
+ Manage this file with `mcporter config list|get|add|remove|import` when you’d rather avoid hand-editing JSON; see [docs/config.md](docs/config.md) for the full walkthrough.
360
+ Config files are parsed as JSONC, so inline `//` and `/* ... */` comments plus trailing commas are supported in both `mcporter.json` and `mcporter.jsonc`.
361
+
362
+ ### Manage configs with `mcporter config`
363
+
364
+ Run `mcporter config …` via your package manager (pnpm, npm, npx, etc.) when you want an interactive view of project MCPs:
365
+
366
+ - `config list` shows **only local entries** by default and, on TTYs, prints a summary of every other config file (Cursor, Claude, Windsurf, VS Code, etc.) with counts and sample names. Add `--source import` to inspect those imported entries directly or `--json` for scripting.
367
+ - `config get/remove/logout` reuse the fuzzy matching logic from `mcporter list`/`call`, so typos like `sshadcn` auto-correct to `shadcn` (with a dimmed notice) and ambiguous names surface “Did you mean …?” hints.
368
+ - `config import <kind> --copy` pulls editor-managed entries into `config/mcporter.json`, letting you customize or remove them locally without touching upstream files.
369
+ - Every subcommand honors `--config <path>` / `--root <dir>`, making it easy to juggle multiple project configs or workspace-specific overrides.
370
+
371
+ `config/mcporter.json` mirrors Cursor/Claude's shape:
372
+
373
+ ```jsonc
374
+ {
375
+ "mcpServers": {
376
+ "context7": {
377
+ "description": "Context7 docs MCP",
378
+ "baseUrl": "https://mcp.context7.com/mcp",
379
+ "headers": {
380
+ "Authorization": "$env:CONTEXT7_API_KEY"
381
+ }
382
+ },
383
+ "chrome-devtools": {
384
+ "command": "npx",
385
+ "args": ["-y", "chrome-devtools-mcp@latest"],
386
+ "env": { "npm_config_loglevel": "error" }
387
+ }
388
+ },
389
+ "imports": ["cursor", "claude-code", "claude-desktop", "codex", "windsurf", "opencode", "vscode"]
390
+ }
391
+ ```
392
+
393
+ What MCPorter handles for you:
394
+
395
+ - `${VAR}`, `${VAR:-fallback}`, and `$env:VAR` interpolation for headers and env entries.
396
+ - Automatic OAuth token caching under `~/.mcporter/<server>/` unless you override `tokenCacheDir`.
397
+ - Stdio commands inherit the directory of the file that defined them (imports or local config).
398
+ - Import precedence matches the array order; omit `imports` to use the default `["cursor", "claude-code", "claude-desktop", "codex", "windsurf", "opencode", "vscode"]`.
399
+
400
+ Provide `configPath` or `rootDir` to CLI/runtime calls when you juggle multiple config files side by side.
401
+
402
+ #### Config resolution order & system-level configs
403
+
404
+ mcporter reads exactly one primary config per run. The lookup order is:
405
+
406
+ 1. The path you pass via `--config` (or programmatic `configPath`).
407
+ 2. The `MCPORTER_CONFIG` environment variable (set it in your shell to apply everywhere).
408
+ 3. `<root>/config/mcporter.json` inside the current project.
409
+ 4. `~/.mcporter/mcporter.json` or `~/.mcporter/mcporter.jsonc` if the project file is missing.
410
+
411
+ All `mcporter config …` mutations write back to whichever file was selected by that order. To manage a system-wide config explicitly, point the CLI at it:
412
+
413
+ ```bash
414
+ mcporter config --config ~/.mcporter/mcporter.json add global-server https://api.example.com/mcp
415
+ ```
416
+
417
+ Set `MCPORTER_CONFIG=~/.mcporter/mcporter.json` in your shell profile when you want that file to be the default everywhere (handy for `npx mcporter …` runs).
418
+
419
+ ## Testing and CI
420
+
421
+ | Command | Purpose |
422
+ | --- | --- |
423
+ | `pnpm check` | Biome formatting plus Oxlint/tsgolint gate. |
424
+ | `pnpm build` | TypeScript compilation (emits `dist/`). |
425
+ | `pnpm test` | Vitest unit and integration suites (streamable HTTP fixtures included). |
426
+
427
+ CI runs the same trio via GitHub Actions.
428
+
429
+ ## Related
430
+ - CodexBar 🟦🟩 Keep Codex token windows visible in your macOS menu bar. <https://codexbar.app>.
431
+ - Trimmy ✂️ “Paste once, run once.” Flatten multi-line shell snippets so they paste and run. <https://trimmy.app>.
432
+ - Oracle 🧿 Prompt bundler/CLI for multi-model runs (GPT-5.1, Claude, Gemini). <https://github.com/steipete/oracle>.
433
+ - MCP spec ✨ <https://github.com/modelcontextprotocol/specification>
434
+
435
+ ## Debug Hanging Servers Quickly
436
+
437
+ Use `tmux` to keep long-running CLI sessions visible while you investigate lingering MCP transports:
438
+
439
+ ```bash
440
+ tmux new-session -- pnpm mcporter:list
441
+ ```
442
+
443
+ Let it run in the background, then inspect the pane (`tmux capture-pane -pt <session>`), tail stdio logs, or kill the session once the command exits. Pair this with `MCPORTER_DEBUG_HANG=1` when you need verbose handle diagnostics. More detail: [docs/tmux.md](docs/tmux.md) and [docs/hang-debug.md](docs/hang-debug.md).
444
+
445
+ ## License
446
+
447
+ MIT -- see [LICENSE](LICENSE).
448
+
449
+ Further reading: [docs/tool-calling.md](docs/tool-calling.md), [docs/call-syntax.md](docs/call-syntax.md), [docs/adhoc.md](docs/adhoc.md), [docs/emit-ts.md](docs/emit-ts.md), [docs/tmux.md](docs/tmux.md).
package/bin/git ADDED
@@ -0,0 +1,180 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { accessSync, constants, existsSync, realpathSync } from 'node:fs';
4
+ import { dirname, join, normalize, resolve, sep } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import process from 'node:process';
7
+ import { analyzeGitExecution, evaluateGitPolicies } from '../scripts/git-policy';
8
+
9
+ const commandArgs = ['git', ...process.argv.slice(2)];
10
+ const context = analyzeGitExecution(commandArgs, process.cwd());
11
+ const gitBinary = findRealGitBinary();
12
+ if (!gitBinary) {
13
+ console.error('Unable to locate the system git binary outside the Sweetistics git shim.');
14
+ process.exit(1);
15
+ }
16
+
17
+ if (!shouldEnforcePolicies(context)) {
18
+ process.exit(await runGitPassthrough(gitBinary));
19
+ }
20
+
21
+ const evaluation = evaluateGitPolicies(context);
22
+
23
+ if (evaluation.requiresCommitHelper) {
24
+ console.error(
25
+ 'Direct git add/commit is disabled. Use ./scripts/committer "chore(runner): describe change" "scripts/runner.ts" instead—see AGENTS.md and ./scripts/committer for details. The helper auto-stashes unrelated files before committing.'
26
+ );
27
+ process.exit(1);
28
+ }
29
+
30
+ if (evaluation.requiresExplicitConsent) {
31
+ if (process.env.RUNNER_THE_USER_GAVE_ME_CONSENT === '1') {
32
+ if (process.env.RUNNER_DEBUG === '1') {
33
+ console.error('[git-shim] Proceeding with guarded git command because RUNNER_THE_USER_GAVE_ME_CONSENT=1.');
34
+ }
35
+ } else {
36
+ console.error(
37
+ `Using git ${context.subcommand ?? ''} requires consent. Set RUNNER_THE_USER_GAVE_ME_CONSENT=1 after verifying with the user, or ask them explicitly before proceeding.`
38
+ );
39
+ process.exit(1);
40
+ }
41
+ }
42
+
43
+ if (evaluation.isDestructive) {
44
+ console.error(
45
+ 'Destructive git commands require explicit user consent. If you are trying to revert an individual file, carefully undo your changes from memory. Other agents work in this repository and a blanket reset would risk overriding their non-committed work.'
46
+ );
47
+ process.exit(1);
48
+ }
49
+
50
+ process.exit(await runGitPassthrough(gitBinary));
51
+
52
+ function findRealGitBinary(): string | null {
53
+ const scriptDir = normalize(dirname(fileURLToPath(import.meta.url)));
54
+
55
+ const pathCandidates = (process.env.PATH ?? '')
56
+ .split(':')
57
+ .map((segment) => segment.trim())
58
+ .filter((segment) => segment.length > 0);
59
+
60
+ for (const segment of pathCandidates) {
61
+ const normalized = normalize(resolve(segment));
62
+ if (normalized === scriptDir) {
63
+ continue;
64
+ }
65
+ const candidate = join(normalized, 'git');
66
+ if (isExecutable(candidate)) {
67
+ return candidate;
68
+ }
69
+ }
70
+
71
+ for (const fallback of ['/usr/bin/git', '/usr/local/bin/git', '/opt/homebrew/bin/git']) {
72
+ if (isExecutable(fallback)) {
73
+ return fallback;
74
+ }
75
+ }
76
+
77
+ return null;
78
+ }
79
+
80
+ function isExecutable(candidate: string): boolean {
81
+ if (!existsSync(candidate)) {
82
+ return false;
83
+ }
84
+ try {
85
+ accessSync(candidate, constants.X_OK);
86
+ return true;
87
+ } catch {
88
+ return false;
89
+ }
90
+ }
91
+
92
+ async function runGitPassthrough(binary: string): Promise<number> {
93
+ const proc = Bun.spawn([binary, ...process.argv.slice(2)], {
94
+ stdin: 'inherit',
95
+ stdout: 'inherit',
96
+ stderr: 'inherit',
97
+ env: process.env,
98
+ });
99
+ return proc.exited;
100
+ }
101
+
102
+ function shouldEnforcePolicies(context: ReturnType<typeof analyzeGitExecution>): boolean {
103
+ const scriptDir = dirname(fileURLToPath(import.meta.url));
104
+ let repoRoot: string | null = null;
105
+ try {
106
+ repoRoot = realpathSync(resolve(scriptDir, '..'));
107
+ } catch {
108
+ return false;
109
+ }
110
+
111
+ const candidatePaths = collectCandidatePaths(context);
112
+
113
+ for (const path of candidatePaths) {
114
+ if (path && isPathInsideRepo(path, repoRoot)) {
115
+ return true;
116
+ }
117
+ }
118
+
119
+ return false;
120
+ }
121
+
122
+ function collectCandidatePaths(context: ReturnType<typeof analyzeGitExecution>): Set<string> {
123
+ const candidates = new Set<string>();
124
+
125
+ if (context.workDir) {
126
+ candidates.add(context.workDir);
127
+ }
128
+
129
+ const argv = toArray(context.invocation?.argv);
130
+ for (let index = 1; index < argv.length; index += 1) {
131
+ const token = argv[index];
132
+
133
+ if (token === '-C' || token === '--git-dir' || token === '--work-tree') {
134
+ const value = argv[index + 1];
135
+ if (value) {
136
+ candidates.add(resolve(context.workDir, value));
137
+ }
138
+ index += 1;
139
+ continue;
140
+ }
141
+
142
+ if (token.startsWith('-C') && token.length > 2) {
143
+ candidates.add(resolve(context.workDir, token.slice(2)));
144
+ continue;
145
+ }
146
+
147
+ if (token.startsWith('--git-dir=')) {
148
+ candidates.add(resolve(context.workDir, token.slice('--git-dir='.length)));
149
+ continue;
150
+ }
151
+
152
+ if (token.startsWith('--work-tree=')) {
153
+ candidates.add(resolve(context.workDir, token.slice('--work-tree='.length)));
154
+ }
155
+ }
156
+
157
+ return candidates;
158
+ }
159
+
160
+ function isPathInsideRepo(candidate: string, repoRoot: string): boolean {
161
+ try {
162
+ const realCandidate = realpathSync(candidate);
163
+ if (realCandidate === repoRoot) {
164
+ return true;
165
+ }
166
+ return realCandidate.startsWith(repoRoot.endsWith(sep) ? repoRoot : `${repoRoot}${sep}`);
167
+ } catch {
168
+ return false;
169
+ }
170
+ }
171
+
172
+ function toArray<T>(value: T | T[] | null | undefined): T[] {
173
+ if (value == null) {
174
+ return [];
175
+ }
176
+ if (Array.isArray(value)) {
177
+ return value;
178
+ }
179
+ return [value];
180
+ }
package/biome.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.4.5/schema.json",
3
+ "vcs": {
4
+ "enabled": true,
5
+ "clientKind": "git",
6
+ "useIgnoreFile": true
7
+ },
8
+ "javascript": {
9
+ "formatter": {
10
+ "quoteStyle": "single",
11
+ "semicolons": "always",
12
+ "trailingCommas": "es5"
13
+ }
14
+ },
15
+ "json": {
16
+ "formatter": {
17
+ "indentStyle": "space",
18
+ "indentWidth": 2
19
+ }
20
+ },
21
+ "files": {
22
+ "ignoreUnknown": false,
23
+ "maxSize": 1048576,
24
+ "includes": ["src/**", "tests/**", "docs/**", "scripts/**", "!dist", "!tmp", "!node_modules"]
25
+ },
26
+ "formatter": {
27
+ "enabled": true,
28
+ "indentStyle": "space",
29
+ "indentWidth": 2,
30
+ "lineWidth": 120
31
+ },
32
+ "linter": {
33
+ "enabled": true,
34
+ "rules": {
35
+ "recommended": true,
36
+ "style": {
37
+ "useConst": "error",
38
+ "useTemplate": "error",
39
+ "useBlockStatements": "warn"
40
+ }
41
+ }
42
+ }
43
+ }