studiograph 1.1.2 → 1.2.0-beta.1

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 (349) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +301 -10
  3. package/dist/agent/orchestrator.d.ts +17 -9
  4. package/dist/agent/orchestrator.js +142 -97
  5. package/dist/agent/orchestrator.js.map +1 -1
  6. package/dist/agent/prompts/system.md +186 -0
  7. package/dist/agent/skill-loader.d.ts +48 -0
  8. package/dist/agent/skill-loader.js +166 -0
  9. package/dist/agent/skill-loader.js.map +1 -0
  10. package/dist/agent/skills/enrich-entities.md +136 -0
  11. package/dist/agent/skills/entity-schema.md +502 -0
  12. package/dist/agent/skills/gather-context.md +46 -0
  13. package/dist/agent/skills/obsidian-source-setup.md +246 -0
  14. package/dist/agent/skills/skill-loader.d.ts +48 -0
  15. package/dist/agent/skills/skill-loader.js +166 -0
  16. package/dist/agent/skills/skill-loader.js.map +1 -0
  17. package/dist/agent/skills/sync-configuration.md +144 -0
  18. package/dist/agent/skills/sync-setup.md +68 -0
  19. package/dist/agent/tools/connector-tools.d.ts +37 -0
  20. package/dist/agent/tools/connector-tools.js +132 -0
  21. package/dist/agent/tools/connector-tools.js.map +1 -0
  22. package/dist/agent/tools/fs-tools.d.ts +39 -0
  23. package/dist/agent/tools/fs-tools.js +106 -0
  24. package/dist/agent/tools/fs-tools.js.map +1 -0
  25. package/dist/agent/tools/graph-tools.d.ts +30 -2
  26. package/dist/agent/tools/graph-tools.js +154 -37
  27. package/dist/agent/tools/graph-tools.js.map +1 -1
  28. package/dist/agent/tools/load-skill.d.ts +42 -0
  29. package/dist/agent/tools/load-skill.js +45 -0
  30. package/dist/agent/tools/load-skill.js.map +1 -0
  31. package/dist/agent/tools/sync-tools.d.ts +25 -0
  32. package/dist/agent/tools/sync-tools.js +691 -0
  33. package/dist/agent/tools/sync-tools.js.map +1 -0
  34. package/dist/agent/tools/tool-loader.d.ts +25 -0
  35. package/dist/agent/tools/tool-loader.js +73 -0
  36. package/dist/agent/tools/tool-loader.js.map +1 -0
  37. package/dist/auth/github.d.ts +11 -8
  38. package/dist/auth/github.js +56 -75
  39. package/dist/auth/github.js.map +1 -1
  40. package/dist/cli/colors.d.ts +54 -0
  41. package/dist/cli/colors.js +133 -0
  42. package/dist/cli/colors.js.map +1 -0
  43. package/dist/cli/commands/app.d.ts +7 -0
  44. package/dist/cli/commands/app.js +167 -0
  45. package/dist/cli/commands/app.js.map +1 -0
  46. package/dist/cli/commands/auth.d.ts +1 -1
  47. package/dist/cli/commands/auth.js +26 -10
  48. package/dist/cli/commands/auth.js.map +1 -1
  49. package/dist/cli/commands/clone.d.ts +9 -0
  50. package/dist/cli/commands/clone.js +167 -0
  51. package/dist/cli/commands/clone.js.map +1 -0
  52. package/dist/cli/commands/commit.d.ts +8 -0
  53. package/dist/cli/commands/commit.js +43 -0
  54. package/dist/cli/commands/commit.js.map +1 -0
  55. package/dist/cli/commands/config.d.ts +13 -0
  56. package/dist/cli/commands/config.js +276 -0
  57. package/dist/cli/commands/config.js.map +1 -0
  58. package/dist/cli/commands/connector.d.ts +33 -0
  59. package/dist/cli/commands/connector.js +178 -0
  60. package/dist/cli/commands/connector.js.map +1 -0
  61. package/dist/cli/commands/deploy.d.ts +11 -0
  62. package/dist/cli/commands/deploy.js +153 -0
  63. package/dist/cli/commands/deploy.js.map +1 -0
  64. package/dist/cli/commands/enrich.d.ts +11 -0
  65. package/dist/cli/commands/enrich.js +135 -0
  66. package/dist/cli/commands/enrich.js.map +1 -0
  67. package/dist/cli/commands/graphrag.d.ts +12 -0
  68. package/dist/cli/commands/graphrag.js +122 -0
  69. package/dist/cli/commands/graphrag.js.map +1 -0
  70. package/dist/cli/commands/index.d.ts +15 -0
  71. package/dist/cli/commands/index.js +117 -0
  72. package/dist/cli/commands/index.js.map +1 -0
  73. package/dist/cli/commands/init.js +110 -210
  74. package/dist/cli/commands/init.js.map +1 -1
  75. package/dist/cli/commands/join.js +89 -24
  76. package/dist/cli/commands/join.js.map +1 -1
  77. package/dist/cli/commands/lint.d.ts +8 -0
  78. package/dist/cli/commands/lint.js +70 -0
  79. package/dist/cli/commands/lint.js.map +1 -0
  80. package/dist/cli/commands/mcp.d.ts +27 -0
  81. package/dist/cli/commands/mcp.js +56 -0
  82. package/dist/cli/commands/mcp.js.map +1 -0
  83. package/dist/cli/commands/orphans.d.ts +8 -0
  84. package/dist/cli/commands/orphans.js +125 -0
  85. package/dist/cli/commands/orphans.js.map +1 -0
  86. package/dist/cli/commands/provision.d.ts +8 -0
  87. package/dist/cli/commands/provision.js +116 -0
  88. package/dist/cli/commands/provision.js.map +1 -0
  89. package/dist/cli/commands/r2.d.ts +2 -0
  90. package/dist/cli/commands/r2.js +87 -6
  91. package/dist/cli/commands/r2.js.map +1 -1
  92. package/dist/cli/commands/reset.d.ts +12 -0
  93. package/dist/cli/commands/reset.js +137 -0
  94. package/dist/cli/commands/reset.js.map +1 -0
  95. package/dist/cli/commands/review.d.ts +19 -0
  96. package/dist/cli/commands/review.js +128 -0
  97. package/dist/cli/commands/review.js.map +1 -0
  98. package/dist/cli/commands/serve.js +47 -2
  99. package/dist/cli/commands/serve.js.map +1 -1
  100. package/dist/cli/commands/source.d.ts +16 -0
  101. package/dist/cli/commands/source.js +159 -0
  102. package/dist/cli/commands/source.js.map +1 -0
  103. package/dist/cli/commands/start.js +472 -103
  104. package/dist/cli/commands/start.js.map +1 -1
  105. package/dist/cli/commands/sync-entities.d.ts +13 -0
  106. package/dist/cli/commands/sync-entities.js +242 -0
  107. package/dist/cli/commands/sync-entities.js.map +1 -0
  108. package/dist/cli/commands/sync.js +40 -9
  109. package/dist/cli/commands/sync.js.map +1 -1
  110. package/dist/cli/commands/update.d.ts +8 -0
  111. package/dist/cli/commands/update.js +155 -0
  112. package/dist/cli/commands/update.js.map +1 -0
  113. package/dist/cli/index.js +114 -3
  114. package/dist/cli/index.js.map +1 -1
  115. package/dist/cli/scaffolding.d.ts +10 -0
  116. package/dist/cli/scaffolding.js +302 -0
  117. package/dist/cli/scaffolding.js.map +1 -0
  118. package/dist/cli/setup-wizard.d.ts +30 -0
  119. package/dist/cli/setup-wizard.js +244 -0
  120. package/dist/cli/setup-wizard.js.map +1 -0
  121. package/dist/cli/sync-review-interactive.d.ts +31 -0
  122. package/dist/cli/sync-review-interactive.js +393 -0
  123. package/dist/cli/sync-review-interactive.js.map +1 -0
  124. package/dist/cli/theme.d.ts +31 -0
  125. package/dist/cli/theme.js +116 -0
  126. package/dist/cli/theme.js.map +1 -0
  127. package/dist/core/graph.d.ts +16 -9
  128. package/dist/core/graph.js +263 -145
  129. package/dist/core/graph.js.map +1 -1
  130. package/dist/core/migration-runner.d.ts +42 -0
  131. package/dist/core/migration-runner.js +232 -0
  132. package/dist/core/migration-runner.js.map +1 -0
  133. package/dist/core/migration-types.d.ts +101 -0
  134. package/dist/core/migration-types.js +21 -0
  135. package/dist/core/migration-types.js.map +1 -0
  136. package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
  137. package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
  138. package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
  139. package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
  140. package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
  141. package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
  142. package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
  143. package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
  144. package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
  145. package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
  146. package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
  147. package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
  148. package/dist/core/migrations/index.d.ts +11 -0
  149. package/dist/core/migrations/index.js +23 -0
  150. package/dist/core/migrations/index.js.map +1 -0
  151. package/dist/core/schema-registry.d.ts +36 -0
  152. package/dist/core/schema-registry.js +161 -0
  153. package/dist/core/schema-registry.js.map +1 -0
  154. package/dist/core/types.d.ts +242 -3
  155. package/dist/core/types.js +21 -2
  156. package/dist/core/types.js.map +1 -1
  157. package/dist/core/user-config.d.ts +16 -0
  158. package/dist/core/user-config.js +8 -0
  159. package/dist/core/user-config.js.map +1 -1
  160. package/dist/core/validation.d.ts +973 -32
  161. package/dist/core/validation.js +163 -4
  162. package/dist/core/validation.js.map +1 -1
  163. package/dist/core/workspace-manager.d.ts +26 -2
  164. package/dist/core/workspace-manager.js +113 -15
  165. package/dist/core/workspace-manager.js.map +1 -1
  166. package/dist/core/workspace.d.ts +20 -11
  167. package/dist/core/workspace.js +123 -34
  168. package/dist/core/workspace.js.map +1 -1
  169. package/dist/mcp/connector-manager.d.ts +65 -0
  170. package/dist/mcp/connector-manager.js +223 -0
  171. package/dist/mcp/connector-manager.js.map +1 -0
  172. package/dist/mcp/connectors/asana.d.ts +2 -0
  173. package/dist/mcp/connectors/asana.js +20 -0
  174. package/dist/mcp/connectors/asana.js.map +1 -0
  175. package/dist/mcp/connectors/definitions.d.ts +45 -0
  176. package/dist/mcp/connectors/definitions.js +32 -0
  177. package/dist/mcp/connectors/definitions.js.map +1 -0
  178. package/dist/mcp/connectors/figma.d.ts +5 -0
  179. package/dist/mcp/connectors/figma.js +21 -0
  180. package/dist/mcp/connectors/figma.js.map +1 -0
  181. package/dist/mcp/connectors/gdrive.d.ts +2 -0
  182. package/dist/mcp/connectors/gdrive.js +20 -0
  183. package/dist/mcp/connectors/gdrive.js.map +1 -0
  184. package/dist/mcp/connectors/granola.d.ts +2 -0
  185. package/dist/mcp/connectors/granola.js +12 -0
  186. package/dist/mcp/connectors/granola.js.map +1 -0
  187. package/dist/mcp/connectors/linear.d.ts +2 -0
  188. package/dist/mcp/connectors/linear.js +19 -0
  189. package/dist/mcp/connectors/linear.js.map +1 -0
  190. package/dist/mcp/connectors/obsidian.d.ts +2 -0
  191. package/dist/mcp/connectors/obsidian.js +19 -0
  192. package/dist/mcp/connectors/obsidian.js.map +1 -0
  193. package/dist/mcp/connectors/pipedrive.d.ts +2 -0
  194. package/dist/mcp/connectors/pipedrive.js +20 -0
  195. package/dist/mcp/connectors/pipedrive.js.map +1 -0
  196. package/dist/mcp/connectors/slack.d.ts +2 -0
  197. package/dist/mcp/connectors/slack.js +21 -0
  198. package/dist/mcp/connectors/slack.js.map +1 -0
  199. package/dist/mcp/oauth-provider.d.ts +41 -0
  200. package/dist/mcp/oauth-provider.js +160 -0
  201. package/dist/mcp/oauth-provider.js.map +1 -0
  202. package/dist/mcp/server.d.ts +11 -0
  203. package/dist/mcp/server.js +28 -0
  204. package/dist/mcp/server.js.map +1 -0
  205. package/dist/mcp/tools.d.ts +14 -0
  206. package/dist/mcp/tools.js +172 -0
  207. package/dist/mcp/tools.js.map +1 -0
  208. package/dist/server/index.js +17 -4
  209. package/dist/server/index.js.map +1 -1
  210. package/dist/server/plugin-loader.d.ts +15 -0
  211. package/dist/server/plugin-loader.js +68 -2
  212. package/dist/server/plugin-loader.js.map +1 -1
  213. package/dist/server/routes/graph-api.js +1 -1
  214. package/dist/server/routes/graph-api.js.map +1 -1
  215. package/dist/server/routes/webhook.js +33 -0
  216. package/dist/server/routes/webhook.js.map +1 -1
  217. package/dist/services/github-provisioner.d.ts +9 -3
  218. package/dist/services/github-provisioner.js +46 -8
  219. package/dist/services/github-provisioner.js.map +1 -1
  220. package/dist/services/lint-service.d.ts +27 -0
  221. package/dist/services/lint-service.js +83 -0
  222. package/dist/services/lint-service.js.map +1 -0
  223. package/dist/services/markdown.d.ts +9 -0
  224. package/dist/services/markdown.js +26 -5
  225. package/dist/services/markdown.js.map +1 -1
  226. package/dist/services/memory-service.d.ts +1 -2
  227. package/dist/services/memory-service.js +5 -4
  228. package/dist/services/memory-service.js.map +1 -1
  229. package/dist/services/orphan-service.d.ts +31 -0
  230. package/dist/services/orphan-service.js +100 -0
  231. package/dist/services/orphan-service.js.map +1 -0
  232. package/dist/services/sync/commit.d.ts +58 -0
  233. package/dist/services/sync/commit.js +350 -0
  234. package/dist/services/sync/commit.js.map +1 -0
  235. package/dist/services/sync/context-index.d.ts +69 -0
  236. package/dist/services/sync/context-index.js +280 -0
  237. package/dist/services/sync/context-index.js.map +1 -0
  238. package/dist/services/sync/derive.d.ts +34 -0
  239. package/dist/services/sync/derive.js +164 -0
  240. package/dist/services/sync/derive.js.map +1 -0
  241. package/dist/services/sync/enrichment-state.d.ts +31 -0
  242. package/dist/services/sync/enrichment-state.js +63 -0
  243. package/dist/services/sync/enrichment-state.js.map +1 -0
  244. package/dist/services/sync/enrichment.d.ts +25 -0
  245. package/dist/services/sync/enrichment.js +121 -0
  246. package/dist/services/sync/enrichment.js.map +1 -0
  247. package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
  248. package/dist/services/sync/frontmatter-extractor.js +273 -0
  249. package/dist/services/sync/frontmatter-extractor.js.map +1 -0
  250. package/dist/services/sync/graph-match-state.d.ts +33 -0
  251. package/dist/services/sync/graph-match-state.js +61 -0
  252. package/dist/services/sync/graph-match-state.js.map +1 -0
  253. package/dist/services/sync/graph-match.d.ts +53 -0
  254. package/dist/services/sync/graph-match.js +316 -0
  255. package/dist/services/sync/graph-match.js.map +1 -0
  256. package/dist/services/sync/graphrag-client.d.ts +43 -0
  257. package/dist/services/sync/graphrag-client.js +94 -0
  258. package/dist/services/sync/graphrag-client.js.map +1 -0
  259. package/dist/services/sync/graphrag-config.d.ts +16 -0
  260. package/dist/services/sync/graphrag-config.js +39 -0
  261. package/dist/services/sync/graphrag-config.js.map +1 -0
  262. package/dist/services/sync/graphrag-context.d.ts +14 -0
  263. package/dist/services/sync/graphrag-context.js +109 -0
  264. package/dist/services/sync/graphrag-context.js.map +1 -0
  265. package/dist/services/sync/graphrag-indexer.d.ts +30 -0
  266. package/dist/services/sync/graphrag-indexer.js +358 -0
  267. package/dist/services/sync/graphrag-indexer.js.map +1 -0
  268. package/dist/services/sync/llm.d.ts +32 -0
  269. package/dist/services/sync/llm.js +115 -0
  270. package/dist/services/sync/llm.js.map +1 -0
  271. package/dist/services/sync/mcp-client.d.ts +59 -0
  272. package/dist/services/sync/mcp-client.js +285 -0
  273. package/dist/services/sync/mcp-client.js.map +1 -0
  274. package/dist/services/sync/model-factory.d.ts +10 -0
  275. package/dist/services/sync/model-factory.js +24 -0
  276. package/dist/services/sync/model-factory.js.map +1 -0
  277. package/dist/services/sync/name-quality.d.ts +31 -0
  278. package/dist/services/sync/name-quality.js +60 -0
  279. package/dist/services/sync/name-quality.js.map +1 -0
  280. package/dist/services/sync/output-schemas.d.ts +92 -0
  281. package/dist/services/sync/output-schemas.js +43 -0
  282. package/dist/services/sync/output-schemas.js.map +1 -0
  283. package/dist/services/sync/prompts.d.ts +19 -0
  284. package/dist/services/sync/prompts.js +128 -0
  285. package/dist/services/sync/prompts.js.map +1 -0
  286. package/dist/services/sync/reconciler.d.ts +48 -0
  287. package/dist/services/sync/reconciler.js +295 -0
  288. package/dist/services/sync/reconciler.js.map +1 -0
  289. package/dist/services/sync/source-config.d.ts +45 -0
  290. package/dist/services/sync/source-config.js +208 -0
  291. package/dist/services/sync/source-config.js.map +1 -0
  292. package/dist/services/sync/source-definitions/asana.d.ts +15 -0
  293. package/dist/services/sync/source-definitions/asana.js +48 -0
  294. package/dist/services/sync/source-definitions/asana.js.map +1 -0
  295. package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
  296. package/dist/services/sync/source-definitions/definitions.js +26 -0
  297. package/dist/services/sync/source-definitions/definitions.js.map +1 -0
  298. package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
  299. package/dist/services/sync/source-definitions/gdrive.js +68 -0
  300. package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
  301. package/dist/services/sync/source-definitions/granola.d.ts +2 -0
  302. package/dist/services/sync/source-definitions/granola.js +28 -0
  303. package/dist/services/sync/source-definitions/granola.js.map +1 -0
  304. package/dist/services/sync/source-definitions/linear.d.ts +2 -0
  305. package/dist/services/sync/source-definitions/linear.js +60 -0
  306. package/dist/services/sync/source-definitions/linear.js.map +1 -0
  307. package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
  308. package/dist/services/sync/source-definitions/obsidian.js +55 -0
  309. package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
  310. package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
  311. package/dist/services/sync/source-definitions/pipedrive.js +52 -0
  312. package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
  313. package/dist/services/sync/staging.d.ts +53 -0
  314. package/dist/services/sync/staging.js +131 -0
  315. package/dist/services/sync/staging.js.map +1 -0
  316. package/dist/services/sync/structured-extractor.d.ts +49 -0
  317. package/dist/services/sync/structured-extractor.js +344 -0
  318. package/dist/services/sync/structured-extractor.js.map +1 -0
  319. package/dist/services/sync/sync-runner.d.ts +32 -0
  320. package/dist/services/sync/sync-runner.js +195 -0
  321. package/dist/services/sync/sync-runner.js.map +1 -0
  322. package/dist/services/sync/sync-state.d.ts +43 -0
  323. package/dist/services/sync/sync-state.js +154 -0
  324. package/dist/services/sync/sync-state.js.map +1 -0
  325. package/dist/services/sync/types.d.ts +203 -0
  326. package/dist/services/sync/types.js +8 -0
  327. package/dist/services/sync/types.js.map +1 -0
  328. package/dist/services/sync/unstructured-extractor.d.ts +29 -0
  329. package/dist/services/sync/unstructured-extractor.js +197 -0
  330. package/dist/services/sync/unstructured-extractor.js.map +1 -0
  331. package/dist/services/vector-service.d.ts +88 -0
  332. package/dist/services/vector-service.js +322 -0
  333. package/dist/services/vector-service.js.map +1 -0
  334. package/dist/utils/git.d.ts +26 -4
  335. package/dist/utils/git.js +55 -7
  336. package/dist/utils/git.js.map +1 -1
  337. package/dist/utils/merge-resolver.d.ts +34 -0
  338. package/dist/utils/merge-resolver.js +201 -0
  339. package/dist/utils/merge-resolver.js.map +1 -0
  340. package/dist/utils/preflight.d.ts +2 -1
  341. package/dist/utils/preflight.js +8 -1
  342. package/dist/utils/preflight.js.map +1 -1
  343. package/dist/utils/version-checker.d.ts +23 -0
  344. package/dist/utils/version-checker.js +116 -0
  345. package/dist/utils/version-checker.js.map +1 -0
  346. package/dist/utils/workspace-config.d.ts +8 -0
  347. package/dist/utils/workspace-config.js +22 -0
  348. package/dist/utils/workspace-config.js.map +1 -0
  349. package/package.json +24 -11
@@ -0,0 +1,223 @@
1
+ /**
2
+ * MCP Connector Manager
3
+ *
4
+ * Connects the Studiograph agent to third-party MCP servers so the agent can
5
+ * query external data sources on demand.
6
+ *
7
+ * Three transport types are supported:
8
+ *
9
+ * http — Remote streamable-HTTP server (e.g. Linear at https://mcp.linear.app/mcp).
10
+ * Requires `url` and `token` fields. Token can be a literal string or a
11
+ * $ENV_VAR reference resolved at runtime.
12
+ *
13
+ * oauth — Remote streamable-HTTP server with OAuth (e.g. Figma at mcp.figma.com/mcp).
14
+ * Requires `url` only. Uses dynamic client registration + PKCE — no client
15
+ * secrets needed. Browser opens for user authorization on first connect.
16
+ *
17
+ * stdio — Local stdio MCP server (e.g. granola-mcp spawned as a child process).
18
+ * Requires `command` and optionally `args` / `env`. No token needed —
19
+ * the server reads its own credentials from wherever it stores them.
20
+ *
21
+ * Connector configs are stored per-user at ~/.studiograph/connectors/<name>.json
22
+ * (mode 0600 — never committed to git).
23
+ *
24
+ * Each connector's tools are injected into the agent with a namespaced prefix:
25
+ * linear__search_issues, granola__list_meetings, etc.
26
+ *
27
+ * Connection failures are non-fatal — the failing connector is skipped with a warning.
28
+ */
29
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
30
+ import { join } from 'path';
31
+ import { homedir } from 'os';
32
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
33
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
34
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
35
+ import { auth } from '@modelcontextprotocol/sdk/client/auth.js';
36
+ import { ConnectorOAuthProvider, waitForOAuthCallback } from './oauth-provider.js';
37
+ export const CONNECTORS_DIR = join(homedir(), '.studiograph', 'connectors');
38
+ // ── ConnectorManager ──────────────────────────────────────────────────────────
39
+ export class ConnectorManager {
40
+ // ── config persistence ────────────────────────────────────────────────────
41
+ static loadConfigs() {
42
+ if (!existsSync(CONNECTORS_DIR))
43
+ return [];
44
+ let entries;
45
+ try {
46
+ entries = readdirSync(CONNECTORS_DIR);
47
+ }
48
+ catch {
49
+ return [];
50
+ }
51
+ const configs = [];
52
+ for (const entry of entries) {
53
+ if (!entry.endsWith('.json'))
54
+ continue;
55
+ try {
56
+ const raw = JSON.parse(readFileSync(join(CONNECTORS_DIR, entry), 'utf-8'));
57
+ if (typeof raw.name !== 'string' || !raw.name) {
58
+ console.warn(`[connectors] Skipping malformed config (missing name): ${entry}`);
59
+ continue;
60
+ }
61
+ const resolved = ConnectorManager._resolveType(raw);
62
+ if (!ConnectorManager._validate(resolved, entry))
63
+ continue;
64
+ configs.push(resolved);
65
+ }
66
+ catch {
67
+ console.warn(`[connectors] Could not parse ${entry} — skipping`);
68
+ }
69
+ }
70
+ return configs;
71
+ }
72
+ static saveConfig(config) {
73
+ mkdirSync(CONNECTORS_DIR, { recursive: true });
74
+ const path = join(CONNECTORS_DIR, `${config.name}.json`);
75
+ writeFileSync(path, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
76
+ }
77
+ static removeConfig(name) {
78
+ const path = join(CONNECTORS_DIR, `${name}.json`);
79
+ if (!existsSync(path))
80
+ return false;
81
+ unlinkSync(path);
82
+ return true;
83
+ }
84
+ // ── token resolution ──────────────────────────────────────────────────────
85
+ /** Expands $ENV_VAR references; returns the literal string otherwise. */
86
+ static resolveToken(token) {
87
+ if (token.startsWith('$')) {
88
+ return process.env[token.slice(1)] ?? token;
89
+ }
90
+ return token;
91
+ }
92
+ // ── tool building ─────────────────────────────────────────────────────────
93
+ /**
94
+ * For each connector config: connect to the MCP server, fetch its tool list,
95
+ * and return Pi-Mono-compatible tool objects with namespaced names.
96
+ *
97
+ * Failures are non-fatal — the connector is skipped with a console.warn.
98
+ */
99
+ static async buildTools(configs, timeoutMs = 10_000) {
100
+ const tools = [];
101
+ for (const config of configs) {
102
+ try {
103
+ const connectorTools = await Promise.race([
104
+ ConnectorManager._buildConnectorTools(config),
105
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Connection timed out')), timeoutMs)),
106
+ ]);
107
+ tools.push(...connectorTools);
108
+ }
109
+ catch (err) {
110
+ const msg = err instanceof Error ? err.message : String(err);
111
+ const isLocal = /^https?:\/\/(localhost|127\.0\.0\.1)(:|\/|$)/.test(config.url ?? '');
112
+ const isUnavailable = /timed out|ECONNREFUSED|fetch failed/i.test(msg);
113
+ if (isLocal && isUnavailable) {
114
+ console.warn(`[connectors] ${config.name} skipped — local server not running (${config.url})`);
115
+ }
116
+ else {
117
+ console.warn(`[connectors] Failed to connect to "${config.name}" (${config.type === 'stdio' ? config.command : config.url}): ${msg}`);
118
+ }
119
+ }
120
+ }
121
+ return tools;
122
+ }
123
+ // ── private helpers ───────────────────────────────────────────────────────
124
+ static _resolveType(config) {
125
+ if (config.type)
126
+ return config;
127
+ // Infer type from fields present
128
+ if (config.command)
129
+ return { ...config, type: 'stdio' };
130
+ return { ...config, type: 'http' };
131
+ }
132
+ static _validate(config, filename) {
133
+ if (config.type === 'stdio') {
134
+ if (!config.command) {
135
+ console.warn(`[connectors] stdio connector "${config.name}" missing "command" — skipping`);
136
+ return false;
137
+ }
138
+ }
139
+ else if (config.type === 'oauth') {
140
+ if (!config.url) {
141
+ console.warn(`[connectors] oauth connector "${config.name}" missing "url" — skipping`);
142
+ return false;
143
+ }
144
+ }
145
+ else {
146
+ if (!config.url) {
147
+ console.warn(`[connectors] http connector "${config.name}" missing "url" — skipping`);
148
+ return false;
149
+ }
150
+ }
151
+ return true;
152
+ }
153
+ static async _buildConnectorTools(config) {
154
+ let transport;
155
+ if (config.type === 'stdio') {
156
+ transport = new StdioClientTransport({
157
+ command: config.command,
158
+ args: config.args,
159
+ env: config.env,
160
+ stderr: 'ignore',
161
+ });
162
+ }
163
+ else if (config.type === 'oauth') {
164
+ // Pre-authorize before connecting.
165
+ // The SDK only auto-triggers OAuth on 401, but some servers (Figma) return 403
166
+ // for unauthenticated requests. We drive the flow manually to handle both.
167
+ const authProvider = new ConnectorOAuthProvider(config.name);
168
+ const result = await auth(authProvider, {
169
+ serverUrl: config.url,
170
+ });
171
+ if (result === 'REDIRECT') {
172
+ // Browser was opened — wait for the user to authorize
173
+ console.log(`[connectors] ${config.name} requires authorization — waiting for browser...`);
174
+ const code = await waitForOAuthCallback();
175
+ // Exchange the authorization code for tokens
176
+ await auth(authProvider, {
177
+ serverUrl: config.url,
178
+ authorizationCode: code,
179
+ });
180
+ }
181
+ transport = new StreamableHTTPClientTransport(new URL(config.url), {
182
+ authProvider,
183
+ });
184
+ }
185
+ else {
186
+ const requestInit = config.token
187
+ ? { headers: { Authorization: `Bearer ${ConnectorManager.resolveToken(config.token)}` } }
188
+ : {};
189
+ transport = new StreamableHTTPClientTransport(new URL(config.url), { requestInit });
190
+ }
191
+ const client = new Client({ name: 'studiograph', version: '1.0.0' });
192
+ await client.connect(transport);
193
+ const { tools: remoteTools } = await client.listTools();
194
+ const label = config.description ?? config.name;
195
+ return remoteTools.map(tool => ({
196
+ name: `${config.name}__${tool.name}`,
197
+ label: `${label}: ${tool.title ?? tool.name}`,
198
+ description: `[${config.name}] ${tool.description ?? tool.name}`,
199
+ parameters: tool.inputSchema,
200
+ execute: async (_toolCallId, params) => {
201
+ try {
202
+ const result = await client.callTool({ name: tool.name, arguments: params });
203
+ const text = result.content
204
+ .filter((c) => c.type === 'text')
205
+ .map((c) => c.text)
206
+ .join('\n');
207
+ return {
208
+ content: [{ type: 'text', text: text || JSON.stringify(result, null, 2) }],
209
+ details: result,
210
+ };
211
+ }
212
+ catch (err) {
213
+ const msg = err instanceof Error ? err.message : String(err);
214
+ return {
215
+ content: [{ type: 'text', text: `Error calling ${config.name}__${tool.name}: ${msg}` }],
216
+ isError: true,
217
+ };
218
+ }
219
+ },
220
+ }));
221
+ }
222
+ }
223
+ //# sourceMappingURL=connector-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-manager.js","sourceRoot":"","sources":["../../src/mcp/connector-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,0CAA0C,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AA6B5E,iFAAiF;AAEjF,MAAM,OAAO,gBAAgB;IAE3B,6EAA6E;IAE7E,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3C,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAoB,CAAC;gBAC9F,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9C,OAAO,CAAC,IAAI,CAAC,0DAA0D,KAAK,EAAE,CAAC,CAAC;oBAChF,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBACpD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC;oBAAE,SAAS;gBAC3D,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,gCAAgC,KAAK,aAAa,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAuB;QACvC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;QACzD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAY;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAE7E,yEAAyE;IACzE,MAAM,CAAC,YAAY,CAAC,KAAa;QAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6EAA6E;IAE7E;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAA0B,EAAE,SAAS,GAAG,MAAM;QACpE,MAAM,KAAK,GAAU,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBACxC,gBAAgB,CAAC,oBAAoB,CAAC,MAAM,CAAC;oBAC7C,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,SAAS,CAAC,CACvE;iBACF,CAAC,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAG,8CAA8C,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBACtF,MAAM,aAAa,GAAG,sCAAsC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvE,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,IAAI,wCAAwC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;gBACjG,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,sCAAsC,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE,CACxH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6EAA6E;IAErE,MAAM,CAAC,YAAY,CAAC,MAAuB;QACjD,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC;QAC/B,iCAAiC;QACjC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACxD,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,MAAuB,EAAE,QAAgB;QAChE,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,IAAI,gCAAgC,CAAC,CAAC;gBAC3F,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC;gBACvF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC;gBACtF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAuB;QAC/D,IAAI,SAAS,CAAC;QAEd,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,SAAS,GAAG,IAAI,oBAAoB,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,OAAQ;gBACxB,IAAI,EAAK,MAAM,CAAC,IAAI;gBACpB,GAAG,EAAM,MAAM,CAAC,GAAG;gBACnB,MAAM,EAAG,QAAQ;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnC,mCAAmC;YACnC,+EAA+E;YAC/E,2EAA2E;YAC3E,MAAM,YAAY,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE;gBACtC,SAAS,EAAE,MAAM,CAAC,GAAI;aACvB,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC1B,sDAAsD;gBACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,IAAI,kDAAkD,CAAC,CAAC;gBAC3F,MAAM,IAAI,GAAG,MAAM,oBAAoB,EAAE,CAAC;gBAE1C,6CAA6C;gBAC7C,MAAM,IAAI,CAAC,YAAY,EAAE;oBACvB,SAAS,EAAE,MAAM,CAAC,GAAI;oBACtB,iBAAiB,EAAE,IAAI;iBACxB,CAAC,CAAC;YACL,CAAC;YAED,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAI,CAAC,EAAE;gBAClE,YAAY;aACb,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAgB,MAAM,CAAC,KAAK;gBAC3C,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE;gBACzF,CAAC,CAAC,EAAE,CAAC;YACP,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAI,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAErE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC;QAEhD,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,EAAS,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;YAC3C,KAAK,EAAQ,GAAG,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;YACnD,WAAW,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE;YAChE,UAAU,EAAG,IAAI,CAAC,WAAW;YAE7B,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,MAAW,EAAE,EAAE;gBAClD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC7E,MAAM,IAAI,GAAI,MAAM,CAAC,OAAiB;yBACnC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;yBACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;yBACvB,IAAI,CAAC,IAAI,CAAC,CAAC;oBACd,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;wBACnF,OAAO,EAAE,MAAM;qBAChB,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC7D,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;wBAChG,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import type { ConnectorDefinition } from './definitions.js';
2
+ export declare const asana: ConnectorDefinition;
@@ -0,0 +1,20 @@
1
+ export const asana = {
2
+ name: 'asana',
3
+ label: 'Asana',
4
+ description: 'Asana — tasks, projects, workspaces, team assignments',
5
+ type: 'stdio',
6
+ command: 'npx',
7
+ args: ['-y', '@roychri/mcp-server-asana'],
8
+ credentialFields: [
9
+ {
10
+ key: 'env.ASANA_ACCESS_TOKEN',
11
+ label: 'Asana personal access token',
12
+ description: 'My Profile Settings → Apps → Manage Developer Apps → New access token',
13
+ secret: true,
14
+ required: true,
15
+ placeholder: 'your-personal-access-token',
16
+ },
17
+ ],
18
+ docsUrl: 'https://developers.asana.com/docs/personal-access-token',
19
+ };
20
+ //# sourceMappingURL=asana.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asana.js","sourceRoot":"","sources":["../../../src/mcp/connectors/asana.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAwB;IACxC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,uDAAuD;IACpE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC;IACzC,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,wBAAwB;YAC7B,KAAK,EAAE,6BAA6B;YACpC,WAAW,EAAE,uEAAuE;YACpF,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,4BAA4B;SAC1C;KACF;IACD,OAAO,EAAE,yDAAyD;CACnE,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Connector definitions for the core connector set.
3
+ *
4
+ * Each definition specifies the default transport config and the credential
5
+ * fields to prompt for during interactive `studiograph connector add <name>`.
6
+ *
7
+ * Credentials are stored per-user at ~/.studiograph/connectors/<name>.json
8
+ * (mode 0600 — never committed to git).
9
+ *
10
+ * Individual connector definitions live in separate files for modularity.
11
+ */
12
+ /** A single credential field to prompt for during interactive setup. */
13
+ export interface CredentialField {
14
+ /**
15
+ * Dot-path into the connector config where the value is stored.
16
+ * 'token' → config.token
17
+ * 'env.KEY_NAME' → config.env.KEY_NAME
18
+ */
19
+ key: string;
20
+ /** Display label shown in the interactive prompt */
21
+ label: string;
22
+ /** Help text shown below the prompt */
23
+ description: string;
24
+ /** Mask input (for tokens/passwords) */
25
+ secret: boolean;
26
+ required: boolean;
27
+ /** Example value shown as placeholder */
28
+ placeholder?: string;
29
+ }
30
+ export interface ConnectorDefinition {
31
+ name: string;
32
+ label: string;
33
+ description: string;
34
+ type: 'http' | 'oauth' | 'stdio';
35
+ /** Pre-filled URL for http connectors */
36
+ url?: string;
37
+ /** Pre-filled command for stdio connectors */
38
+ command?: string;
39
+ args?: string[];
40
+ /** Fields to prompt for during interactive setup */
41
+ credentialFields: CredentialField[];
42
+ /** Link to connector/API docs shown during setup */
43
+ docsUrl?: string;
44
+ }
45
+ export declare const CONNECTOR_DEFINITIONS: Record<string, ConnectorDefinition>;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Connector definitions for the core connector set.
3
+ *
4
+ * Each definition specifies the default transport config and the credential
5
+ * fields to prompt for during interactive `studiograph connector add <name>`.
6
+ *
7
+ * Credentials are stored per-user at ~/.studiograph/connectors/<name>.json
8
+ * (mode 0600 — never committed to git).
9
+ *
10
+ * Individual connector definitions live in separate files for modularity.
11
+ */
12
+ import { linear } from './linear.js';
13
+ import { granola } from './granola.js';
14
+ import { slack } from './slack.js';
15
+ import { pipedrive } from './pipedrive.js';
16
+ import { gdrive } from './gdrive.js';
17
+ import { asana } from './asana.js';
18
+ import { figma, figmaRemote } from './figma.js';
19
+ import { obsidian } from './obsidian.js';
20
+ // ── Core connector set ────────────────────────────────────────────────────────
21
+ export const CONNECTOR_DEFINITIONS = {
22
+ linear,
23
+ granola,
24
+ slack,
25
+ pipedrive,
26
+ gdrive,
27
+ asana,
28
+ figma,
29
+ 'figma-remote': figmaRemote,
30
+ obsidian,
31
+ };
32
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/mcp/connectors/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAqCzC,iFAAiF;AAEjF,MAAM,CAAC,MAAM,qBAAqB,GAAwC;IACxE,MAAM;IACN,OAAO;IACP,KAAK;IACL,SAAS;IACT,MAAM;IACN,KAAK;IACL,KAAK;IACL,cAAc,EAAE,WAAW;IAC3B,QAAQ;CACT,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ConnectorDefinition } from './definitions.js';
2
+ /** Local desktop server — requires Figma desktop app running with Dev Mode MCP enabled. */
3
+ export declare const figma: ConnectorDefinition;
4
+ /** Remote OAuth server — full tool set including generate_figma_design. Requires Figma client approval. */
5
+ export declare const figmaRemote: ConnectorDefinition;
@@ -0,0 +1,21 @@
1
+ /** Local desktop server — requires Figma desktop app running with Dev Mode MCP enabled. */
2
+ export const figma = {
3
+ name: 'figma',
4
+ label: 'Figma (desktop)',
5
+ description: 'Figma — read designs, generate FigJam diagrams, Code Connect mappings (via desktop app)',
6
+ type: 'http',
7
+ url: 'http://127.0.0.1:3845/mcp',
8
+ credentialFields: [],
9
+ docsUrl: 'https://developers.figma.com/docs/figma-mcp-server/local-server-installation/',
10
+ };
11
+ /** Remote OAuth server — full tool set including generate_figma_design. Requires Figma client approval. */
12
+ export const figmaRemote = {
13
+ name: 'figma-remote',
14
+ label: 'Figma (remote)',
15
+ description: 'Figma — full tool set including design generation (via OAuth)',
16
+ type: 'oauth',
17
+ url: 'https://mcp.figma.com/mcp',
18
+ credentialFields: [],
19
+ docsUrl: 'https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/',
20
+ };
21
+ //# sourceMappingURL=figma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma.js","sourceRoot":"","sources":["../../../src/mcp/connectors/figma.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,MAAM,CAAC,MAAM,KAAK,GAAwB;IACxC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,yFAAyF;IACtG,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,2BAA2B;IAChC,gBAAgB,EAAE,EAAE;IACpB,OAAO,EAAE,+EAA+E;CACzF,CAAC;AAEF,2GAA2G;AAC3G,MAAM,CAAC,MAAM,WAAW,GAAwB;IAC9C,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,+DAA+D;IAC5E,IAAI,EAAE,OAAO;IACb,GAAG,EAAE,2BAA2B;IAChC,gBAAgB,EAAE,EAAE;IACpB,OAAO,EAAE,gFAAgF;CAC1F,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ConnectorDefinition } from './definitions.js';
2
+ export declare const gdrive: ConnectorDefinition;
@@ -0,0 +1,20 @@
1
+ export const gdrive = {
2
+ name: 'gdrive',
3
+ label: 'Google Drive',
4
+ description: 'Google Drive — read/write docs, sheets, folders, and file metadata',
5
+ type: 'stdio',
6
+ command: 'npx',
7
+ args: ['-y', '@anthropic-ai/google-docs-mcp@latest'],
8
+ credentialFields: [
9
+ {
10
+ key: 'env.GOOGLE_OAUTH_CREDENTIALS',
11
+ label: 'Path to Google OAuth credentials JSON',
12
+ description: 'Download from: Google Cloud Console → APIs & Services → Credentials → OAuth 2.0 Client',
13
+ secret: false,
14
+ required: true,
15
+ placeholder: '~/.config/google/credentials.json',
16
+ },
17
+ ],
18
+ docsUrl: 'https://www.npmjs.com/package/@anthropic-ai/google-docs-mcp',
19
+ };
20
+ //# sourceMappingURL=gdrive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gdrive.js","sourceRoot":"","sources":["../../../src/mcp/connectors/gdrive.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAwB;IACzC,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,oEAAoE;IACjF,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,sCAAsC,CAAC;IACpD,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,8BAA8B;YACnC,KAAK,EAAE,uCAAuC;YAC9C,WAAW,EAAE,wFAAwF;YACrG,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,mCAAmC;SACjD;KACF;IACD,OAAO,EAAE,6DAA6D;CACvE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ConnectorDefinition } from './definitions.js';
2
+ export declare const granola: ConnectorDefinition;
@@ -0,0 +1,12 @@
1
+ export const granola = {
2
+ name: 'granola',
3
+ label: 'Granola',
4
+ description: 'Granola — search and read AI-summarized meeting notes',
5
+ type: 'stdio',
6
+ command: 'npx',
7
+ args: ['-y', 'granola-mcp'],
8
+ // No credential fields — Granola reads auth from the installed Granola app
9
+ credentialFields: [],
10
+ docsUrl: 'https://granola.ai',
11
+ };
12
+ //# sourceMappingURL=granola.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granola.js","sourceRoot":"","sources":["../../../src/mcp/connectors/granola.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAwB;IAC1C,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,uDAAuD;IACpE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC;IAC3B,2EAA2E;IAC3E,gBAAgB,EAAE,EAAE;IACpB,OAAO,EAAE,oBAAoB;CAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ConnectorDefinition } from './definitions.js';
2
+ export declare const linear: ConnectorDefinition;
@@ -0,0 +1,19 @@
1
+ export const linear = {
2
+ name: 'linear',
3
+ label: 'Linear',
4
+ description: 'Linear issue tracking — create/update issues, search projects',
5
+ type: 'http',
6
+ url: 'https://mcp.linear.app/mcp',
7
+ credentialFields: [
8
+ {
9
+ key: 'token',
10
+ label: 'Linear API key',
11
+ description: 'Settings → API → Personal API keys → Create key',
12
+ secret: true,
13
+ required: true,
14
+ placeholder: 'lin_api_...',
15
+ },
16
+ ],
17
+ docsUrl: 'https://linear.app/docs/api',
18
+ };
19
+ //# sourceMappingURL=linear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/mcp/connectors/linear.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAwB;IACzC,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,+DAA+D;IAC5E,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,4BAA4B;IACjC,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,iDAAiD;YAC9D,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,aAAa;SAC3B;KACF;IACD,OAAO,EAAE,6BAA6B;CACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ConnectorDefinition } from './definitions.js';
2
+ export declare const obsidian: ConnectorDefinition;
@@ -0,0 +1,19 @@
1
+ export const obsidian = {
2
+ name: 'obsidian',
3
+ label: 'Obsidian',
4
+ description: 'Obsidian — read and search vault files via a user-provided MCP server',
5
+ type: 'stdio',
6
+ // No command/args — user provides their own MCP server binary
7
+ credentialFields: [
8
+ {
9
+ key: 'env.OBSIDIAN_VAULT',
10
+ label: 'Path to Obsidian vault',
11
+ description: 'Absolute path to the vault directory on disk',
12
+ secret: false,
13
+ required: false,
14
+ placeholder: '~/Vaults/MyVault',
15
+ },
16
+ ],
17
+ docsUrl: 'https://obsidian.md',
18
+ };
19
+ //# sourceMappingURL=obsidian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../src/mcp/connectors/obsidian.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAwB;IAC3C,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,WAAW,EAAE,uEAAuE;IACpF,IAAI,EAAE,OAAO;IACb,8DAA8D;IAC9D,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,oBAAoB;YACzB,KAAK,EAAE,wBAAwB;YAC/B,WAAW,EAAE,8CAA8C;YAC3D,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,kBAAkB;SAChC;KACF;IACD,OAAO,EAAE,qBAAqB;CAC/B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ConnectorDefinition } from './definitions.js';
2
+ export declare const pipedrive: ConnectorDefinition;
@@ -0,0 +1,20 @@
1
+ export const pipedrive = {
2
+ name: 'pipedrive',
3
+ label: 'Pipedrive',
4
+ description: 'Pipedrive CRM — contacts, deals, activities, pipeline',
5
+ type: 'stdio',
6
+ command: 'npx',
7
+ args: ['-y', '@modelcontextprotocol/server-pipedrive'],
8
+ credentialFields: [
9
+ {
10
+ key: 'env.PIPEDRIVE_API_TOKEN',
11
+ label: 'Pipedrive API token',
12
+ description: 'Settings → Personal preferences → API → Your personal API token',
13
+ secret: true,
14
+ required: true,
15
+ placeholder: 'your-api-token',
16
+ },
17
+ ],
18
+ docsUrl: 'https://developers.pipedrive.com/docs/api/v1',
19
+ };
20
+ //# sourceMappingURL=pipedrive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipedrive.js","sourceRoot":"","sources":["../../../src/mcp/connectors/pipedrive.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAwB;IAC5C,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE,uDAAuD;IACpE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,wCAAwC,CAAC;IACtD,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,yBAAyB;YAC9B,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE,iEAAiE;YAC9E,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,gBAAgB;SAC9B;KACF;IACD,OAAO,EAAE,8CAA8C;CACxD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ConnectorDefinition } from './definitions.js';
2
+ export declare const slack: ConnectorDefinition;
@@ -0,0 +1,21 @@
1
+ export const slack = {
2
+ name: 'slack',
3
+ label: 'Slack',
4
+ description: 'Slack — search messages, list channels, post updates',
5
+ type: 'stdio',
6
+ command: 'npx',
7
+ args: ['-y', '@modelcontextprotocol/server-slack'],
8
+ credentialFields: [
9
+ {
10
+ key: 'env.SLACK_BOT_TOKEN',
11
+ label: 'Slack token',
12
+ description: 'Bot token (xoxb-...) or User OAuth token (xoxp-...). ' +
13
+ 'Create at: api.slack.com/apps → OAuth & Permissions',
14
+ secret: true,
15
+ required: true,
16
+ placeholder: 'xoxb-...',
17
+ },
18
+ ],
19
+ docsUrl: 'https://api.slack.com/authentication/token-types',
20
+ };
21
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/mcp/connectors/slack.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAwB;IACxC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,sDAAsD;IACnE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,oCAAoC,CAAC;IAClD,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,qBAAqB;YAC1B,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,uDAAuD;gBAClE,qDAAqD;YACvD,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,UAAU;SACxB;KACF;IACD,OAAO,EAAE,kDAAkD;CAC5D,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * OAuth Client Provider for MCP Connectors
3
+ *
4
+ * Implements OAuthClientProvider from the MCP SDK to support OAuth-based
5
+ * MCP servers (Figma, Linear, etc.) using dynamic client registration.
6
+ *
7
+ * Storage: ~/.studiograph/connectors/<name>.oauth.json (tokens, client info, PKCE verifier)
8
+ * Auth flow: opens browser → local callback server → exchanges code for tokens
9
+ *
10
+ * Works with any MCP server that supports RFC 8414 (OAuth metadata discovery)
11
+ * and RFC 7591 (dynamic client registration). No pre-registered client secrets needed.
12
+ */
13
+ import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
14
+ import type { OAuthClientMetadata, OAuthClientInformationMixed, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
15
+ /**
16
+ * File-backed OAuth provider for a single connector.
17
+ * Stores tokens and client info alongside the connector config.
18
+ */
19
+ export declare class ConnectorOAuthProvider implements OAuthClientProvider {
20
+ private connectorName;
21
+ private storagePath;
22
+ constructor(connectorName: string);
23
+ get redirectUrl(): URL;
24
+ get clientMetadata(): OAuthClientMetadata;
25
+ clientInformation(): Promise<OAuthClientInformationMixed | undefined>;
26
+ saveClientInformation(info: OAuthClientInformationMixed): Promise<void>;
27
+ tokens(): Promise<OAuthTokens | undefined>;
28
+ saveTokens(tokens: OAuthTokens): Promise<void>;
29
+ redirectToAuthorization(authorizationUrl: URL): Promise<void>;
30
+ saveCodeVerifier(codeVerifier: string): Promise<void>;
31
+ codeVerifier(): Promise<string>;
32
+ invalidateCredentials(scope: 'all' | 'client' | 'tokens' | 'verifier'): Promise<void>;
33
+ private _load;
34
+ private _save;
35
+ }
36
+ /**
37
+ * Start a temporary local HTTP server to receive the OAuth callback.
38
+ * Returns a promise that resolves with the authorization code.
39
+ * Server auto-closes after receiving the callback or timing out.
40
+ */
41
+ export declare function waitForOAuthCallback(timeoutMs?: number): Promise<string>;