studiograph 1.1.3 → 1.2.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -8
- package/dist/agent/orchestrator.d.ts +53 -0
- package/dist/agent/orchestrator.js +197 -12
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +43 -11
- package/dist/agent/skill-loader.d.ts +48 -0
- package/dist/agent/skill-loader.js +166 -0
- package/dist/agent/skill-loader.js.map +1 -0
- package/dist/agent/skills/{bundled/enrich-entities.md → enrich-entities.md} +12 -0
- package/dist/agent/skills/entity-schema.md +502 -0
- package/dist/agent/skills/obsidian-source-setup.md +246 -0
- package/dist/agent/skills/sync-configuration.md +144 -0
- package/dist/agent/skills/sync-setup.md +84 -0
- package/dist/agent/tools/connector-tools.d.ts +37 -0
- package/dist/agent/tools/connector-tools.js +132 -0
- package/dist/agent/tools/connector-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +39 -0
- package/dist/agent/tools/fs-tools.js +106 -0
- package/dist/agent/tools/fs-tools.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +33 -1
- package/dist/agent/tools/graph-tools.js +192 -44
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/load-skill.d.ts +1 -1
- package/dist/agent/tools/load-skill.js +1 -1
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +24 -0
- package/dist/agent/tools/ops-tools.js +542 -0
- package/dist/agent/tools/ops-tools.js.map +1 -0
- package/dist/agent/tools/sync-tools.d.ts +33 -0
- package/dist/agent/tools/sync-tools.js +947 -0
- package/dist/agent/tools/sync-tools.js.map +1 -0
- package/dist/auth/github.d.ts +11 -8
- package/dist/auth/github.js +56 -75
- package/dist/auth/github.js.map +1 -1
- package/dist/cli/colors.d.ts +54 -0
- package/dist/cli/colors.js +133 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/app.js +121 -18
- package/dist/cli/commands/app.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.js +26 -10
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/clone.d.ts +9 -0
- package/dist/cli/commands/clone.js +167 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +8 -0
- package/dist/cli/commands/commit.js +44 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/connector.js +10 -2
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.d.ts +4 -6
- package/dist/cli/commands/deploy.js +292 -115
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/enrich.d.ts +11 -0
- package/dist/cli/commands/enrich.js +135 -0
- package/dist/cli/commands/enrich.js.map +1 -0
- package/dist/cli/commands/graphrag.d.ts +12 -0
- package/dist/cli/commands/graphrag.js +122 -0
- package/dist/cli/commands/graphrag.js.map +1 -0
- package/dist/cli/commands/init.js +29 -196
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.js +23 -3
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/orphans.d.ts +8 -0
- package/dist/cli/commands/orphans.js +125 -0
- package/dist/cli/commands/orphans.js.map +1 -0
- package/dist/cli/commands/provision.js +11 -7
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/commands/r2.js +8 -2
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.d.ts +9 -0
- package/dist/cli/commands/redeploy.js +203 -0
- package/dist/cli/commands/redeploy.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.js +137 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/resolve.d.ts +8 -0
- package/dist/cli/commands/resolve.js +85 -0
- package/dist/cli/commands/resolve.js.map +1 -0
- package/dist/cli/commands/review.d.ts +19 -0
- package/dist/cli/commands/review.js +128 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/serve.js +55 -8
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/source.d.ts +16 -0
- package/dist/cli/commands/source.js +159 -0
- package/dist/cli/commands/source.js.map +1 -0
- package/dist/cli/commands/start.js +307 -55
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync-entities.d.ts +13 -0
- package/dist/cli/commands/sync-entities.js +242 -0
- package/dist/cli/commands/sync-entities.js.map +1 -0
- package/dist/cli/commands/sync.js +81 -5
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/index.js +45 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +2 -1
- package/dist/cli/scaffolding.js +38 -23
- package/dist/cli/scaffolding.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +30 -0
- package/dist/cli/setup-wizard.js +244 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/sync-review-interactive.d.ts +31 -0
- package/dist/cli/sync-review-interactive.js +393 -0
- package/dist/cli/sync-review-interactive.js.map +1 -0
- package/dist/cli/theme.d.ts +31 -0
- package/dist/cli/theme.js +116 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/core/graph.d.ts +40 -12
- package/dist/core/graph.js +344 -104
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +4 -1
- package/dist/core/migration-runner.js +14 -3
- package/dist/core/migration-runner.js.map +1 -1
- package/dist/core/types.d.ts +2 -4
- package/dist/core/types.js +1 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +12 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +6 -1
- package/dist/core/workspace-manager.js +29 -4
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +13 -5
- package/dist/core/workspace.js +115 -33
- package/dist/core/workspace.js.map +1 -1
- package/dist/lib/lib/utils.d.ts +2 -0
- package/dist/lib/lib/utils.js +6 -0
- package/dist/lib/lib/utils.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +7 -3
- package/dist/mcp/connector-manager.js +61 -16
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/connectors/asana.d.ts +2 -0
- package/dist/mcp/connectors/asana.js +20 -0
- package/dist/mcp/connectors/asana.js.map +1 -0
- package/dist/mcp/connectors/definitions.d.ts +3 -1
- package/dist/mcp/connectors/definitions.js +19 -127
- package/dist/mcp/connectors/definitions.js.map +1 -1
- package/dist/mcp/connectors/figma.d.ts +5 -0
- package/dist/mcp/connectors/figma.js +21 -0
- package/dist/mcp/connectors/figma.js.map +1 -0
- package/dist/mcp/connectors/gdrive.d.ts +2 -0
- package/dist/mcp/connectors/gdrive.js +20 -0
- package/dist/mcp/connectors/gdrive.js.map +1 -0
- package/dist/mcp/connectors/granola.d.ts +2 -0
- package/dist/mcp/connectors/granola.js +12 -0
- package/dist/mcp/connectors/granola.js.map +1 -0
- package/dist/mcp/connectors/linear.d.ts +2 -0
- package/dist/mcp/connectors/linear.js +19 -0
- package/dist/mcp/connectors/linear.js.map +1 -0
- package/dist/mcp/connectors/obsidian.d.ts +2 -0
- package/dist/mcp/connectors/obsidian.js +19 -0
- package/dist/mcp/connectors/obsidian.js.map +1 -0
- package/dist/mcp/connectors/pipedrive.d.ts +2 -0
- package/dist/mcp/connectors/pipedrive.js +20 -0
- package/dist/mcp/connectors/pipedrive.js.map +1 -0
- package/dist/mcp/connectors/slack.d.ts +2 -0
- package/dist/mcp/connectors/slack.js +21 -0
- package/dist/mcp/connectors/slack.js.map +1 -0
- package/dist/mcp/oauth-provider.d.ts +41 -0
- package/dist/mcp/oauth-provider.js +160 -0
- package/dist/mcp/oauth-provider.js.map +1 -0
- package/dist/server/index.js +97 -11
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +8 -0
- package/dist/server/plugin-loader.js +54 -2
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/routes/chat.d.ts +3 -2
- package/dist/server/routes/chat.js +67 -16
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/git-api.d.ts +9 -0
- package/dist/server/routes/git-api.js +82 -0
- package/dist/server/routes/git-api.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +2 -2
- package/dist/server/routes/graph-api.js +164 -3
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +9 -0
- package/dist/server/routes/workspace-api.js +170 -0
- package/dist/server/routes/workspace-api.js.map +1 -0
- package/dist/services/assets/base.d.ts +2 -2
- package/dist/services/assets/base.js +4 -4
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +6 -6
- package/dist/services/assets/index.js +12 -12
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/git.d.ts +31 -0
- package/dist/services/git.js +92 -3
- package/dist/services/git.js.map +1 -1
- package/dist/services/github-provisioner.d.ts +8 -3
- package/dist/services/github-provisioner.js +35 -8
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/lint-service.js +8 -1
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.js +3 -3
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +1 -1
- package/dist/services/memory-service.js +2 -3
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/orphan-service.d.ts +31 -0
- package/dist/services/orphan-service.js +100 -0
- package/dist/services/orphan-service.js.map +1 -0
- package/dist/services/sync/commit.d.ts +60 -0
- package/dist/services/sync/commit.js +370 -0
- package/dist/services/sync/commit.js.map +1 -0
- package/dist/services/sync/context-index.d.ts +69 -0
- package/dist/services/sync/context-index.js +280 -0
- package/dist/services/sync/context-index.js.map +1 -0
- package/dist/services/sync/derive.d.ts +34 -0
- package/dist/services/sync/derive.js +164 -0
- package/dist/services/sync/derive.js.map +1 -0
- package/dist/services/sync/enrichment-state.d.ts +31 -0
- package/dist/services/sync/enrichment-state.js +63 -0
- package/dist/services/sync/enrichment-state.js.map +1 -0
- package/dist/services/sync/enrichment.d.ts +25 -0
- package/dist/services/sync/enrichment.js +121 -0
- package/dist/services/sync/enrichment.js.map +1 -0
- package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
- package/dist/services/sync/frontmatter-extractor.js +273 -0
- package/dist/services/sync/frontmatter-extractor.js.map +1 -0
- package/dist/services/sync/graph-match-state.d.ts +33 -0
- package/dist/services/sync/graph-match-state.js +61 -0
- package/dist/services/sync/graph-match-state.js.map +1 -0
- package/dist/services/sync/graph-match.d.ts +53 -0
- package/dist/services/sync/graph-match.js +316 -0
- package/dist/services/sync/graph-match.js.map +1 -0
- package/dist/services/sync/graphrag-client.d.ts +43 -0
- package/dist/services/sync/graphrag-client.js +94 -0
- package/dist/services/sync/graphrag-client.js.map +1 -0
- package/dist/services/sync/graphrag-config.d.ts +16 -0
- package/dist/services/sync/graphrag-config.js +39 -0
- package/dist/services/sync/graphrag-config.js.map +1 -0
- package/dist/services/sync/graphrag-context.d.ts +14 -0
- package/dist/services/sync/graphrag-context.js +109 -0
- package/dist/services/sync/graphrag-context.js.map +1 -0
- package/dist/services/sync/graphrag-indexer.d.ts +30 -0
- package/dist/services/sync/graphrag-indexer.js +358 -0
- package/dist/services/sync/graphrag-indexer.js.map +1 -0
- package/dist/services/sync/llm.d.ts +32 -0
- package/dist/services/sync/llm.js +115 -0
- package/dist/services/sync/llm.js.map +1 -0
- package/dist/services/sync/mcp-client.d.ts +59 -0
- package/dist/services/sync/mcp-client.js +285 -0
- package/dist/services/sync/mcp-client.js.map +1 -0
- package/dist/services/sync/model-factory.d.ts +10 -0
- package/dist/services/sync/model-factory.js +24 -0
- package/dist/services/sync/model-factory.js.map +1 -0
- package/dist/services/sync/name-quality.d.ts +31 -0
- package/dist/services/sync/name-quality.js +60 -0
- package/dist/services/sync/name-quality.js.map +1 -0
- package/dist/services/sync/output-schemas.d.ts +92 -0
- package/dist/services/sync/output-schemas.js +43 -0
- package/dist/services/sync/output-schemas.js.map +1 -0
- package/dist/services/sync/prompts.d.ts +19 -0
- package/dist/services/sync/prompts.js +128 -0
- package/dist/services/sync/prompts.js.map +1 -0
- package/dist/services/sync/reconciler.d.ts +48 -0
- package/dist/services/sync/reconciler.js +295 -0
- package/dist/services/sync/reconciler.js.map +1 -0
- package/dist/services/sync/source-config.d.ts +45 -0
- package/dist/services/sync/source-config.js +208 -0
- package/dist/services/sync/source-config.js.map +1 -0
- package/dist/services/sync/source-definitions/asana.d.ts +15 -0
- package/dist/services/sync/source-definitions/asana.js +48 -0
- package/dist/services/sync/source-definitions/asana.js.map +1 -0
- package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
- package/dist/services/sync/source-definitions/definitions.js +26 -0
- package/dist/services/sync/source-definitions/definitions.js.map +1 -0
- package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
- package/dist/services/sync/source-definitions/gdrive.js +68 -0
- package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
- package/dist/services/sync/source-definitions/granola.d.ts +2 -0
- package/dist/services/sync/source-definitions/granola.js +28 -0
- package/dist/services/sync/source-definitions/granola.js.map +1 -0
- package/dist/services/sync/source-definitions/linear.d.ts +2 -0
- package/dist/services/sync/source-definitions/linear.js +60 -0
- package/dist/services/sync/source-definitions/linear.js.map +1 -0
- package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
- package/dist/services/sync/source-definitions/obsidian.js +55 -0
- package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
- package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
- package/dist/services/sync/source-definitions/pipedrive.js +52 -0
- package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
- package/dist/services/sync/staging.d.ts +53 -0
- package/dist/services/sync/staging.js +131 -0
- package/dist/services/sync/staging.js.map +1 -0
- package/dist/services/sync/structured-extractor.d.ts +49 -0
- package/dist/services/sync/structured-extractor.js +344 -0
- package/dist/services/sync/structured-extractor.js.map +1 -0
- package/dist/services/sync/sync-runner.d.ts +32 -0
- package/dist/services/sync/sync-runner.js +195 -0
- package/dist/services/sync/sync-runner.js.map +1 -0
- package/dist/services/sync/sync-state.d.ts +43 -0
- package/dist/services/sync/sync-state.js +154 -0
- package/dist/services/sync/sync-state.js.map +1 -0
- package/dist/services/sync/types.d.ts +203 -0
- package/dist/services/sync/types.js +8 -0
- package/dist/services/sync/types.js.map +1 -0
- package/dist/services/sync/unstructured-extractor.d.ts +29 -0
- package/dist/services/sync/unstructured-extractor.js +197 -0
- package/dist/services/sync/unstructured-extractor.js.map +1 -0
- package/dist/services/vector-service.d.ts +11 -0
- package/dist/services/vector-service.js +42 -0
- package/dist/services/vector-service.js.map +1 -1
- package/dist/utils/git.d.ts +31 -4
- package/dist/utils/git.js +65 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/merge-resolver.d.ts +60 -0
- package/dist/utils/merge-resolver.js +304 -0
- package/dist/utils/merge-resolver.js.map +1 -0
- package/dist/utils/preflight.d.ts +2 -1
- package/dist/utils/preflight.js +8 -1
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/workspace-config.d.ts +8 -0
- package/dist/utils/workspace-config.js +22 -0
- package/dist/utils/workspace-config.js.map +1 -0
- package/dist/web/_app/env.js +1 -0
- package/dist/web/_app/immutable/assets/0.BwJV4fvl.css +1 -0
- package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
- package/dist/web/_app/immutable/assets/3.CnAQdPKU.css +1 -0
- package/dist/web/_app/immutable/assets/4.BG92MufE.css +1 -0
- package/dist/web/_app/immutable/assets/5.CfrQIPYs.css +1 -0
- package/dist/web/_app/immutable/assets/ChatPanel.BNzaCFTL.css +1 -0
- package/dist/web/_app/immutable/assets/editor.D6Rjo7RE.css +1 -0
- package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
- package/dist/web/_app/immutable/chunks/B4G4uWkV.js +1 -0
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
- package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
- package/dist/web/_app/immutable/chunks/CksE5s8n.js +1 -0
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
- package/dist/web/_app/immutable/chunks/D0JBkEPE.js +86 -0
- package/dist/web/_app/immutable/chunks/D2K5GzLj.js +1 -0
- package/dist/web/_app/immutable/chunks/DEkoussQ.js +2 -0
- package/dist/web/_app/immutable/chunks/DW-KmHRi.js +1 -0
- package/dist/web/_app/immutable/chunks/DcCr4z9k.js +1 -0
- package/dist/web/_app/immutable/chunks/Dg2wWwJu.js +2 -0
- package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
- package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
- package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
- package/dist/web/_app/immutable/chunks/SBEriEQR.js +1 -0
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
- package/dist/web/_app/immutable/chunks/YTERt3Ul.js +6 -0
- package/dist/web/_app/immutable/chunks/m_R7HatS.js +1 -0
- package/dist/web/_app/immutable/chunks/vlmEnjfO.js +1 -0
- package/dist/web/_app/immutable/entry/app.B9pwpU_x.js +2 -0
- package/dist/web/_app/immutable/entry/start.CDuNCEco.js +1 -0
- package/dist/web/_app/immutable/nodes/0.YEQhw1us.js +1 -0
- package/dist/web/_app/immutable/nodes/1.CvmHhpRy.js +1 -0
- package/dist/web/_app/immutable/nodes/2.c5k1r7dq.js +1 -0
- package/dist/web/_app/immutable/nodes/3.B24tcdLK.js +1 -0
- package/dist/web/_app/immutable/nodes/4.kX2m5Pp9.js +16 -0
- package/dist/web/_app/immutable/nodes/5.DELt6wTD.js +2 -0
- package/dist/web/_app/version.json +1 -0
- package/dist/web/index.html +41 -0
- package/package.json +21 -7
- /package/dist/agent/skills/{bundled/gather-context.md → gather-context.md} +0 -0
|
@@ -6,135 +6,27 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Credentials are stored per-user at ~/.studiograph/connectors/<name>.json
|
|
8
8
|
* (mode 0600 — never committed to git).
|
|
9
|
+
*
|
|
10
|
+
* Individual connector definitions live in separate files for modularity.
|
|
9
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';
|
|
10
20
|
// ── Core connector set ────────────────────────────────────────────────────────
|
|
11
21
|
export const CONNECTOR_DEFINITIONS = {
|
|
12
|
-
linear
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
label: 'Linear API key',
|
|
22
|
-
description: 'Settings → API → Personal API keys → Create key',
|
|
23
|
-
secret: true,
|
|
24
|
-
required: true,
|
|
25
|
-
placeholder: 'lin_api_...',
|
|
26
|
-
},
|
|
27
|
-
],
|
|
28
|
-
docsUrl: 'https://linear.app/docs/api',
|
|
29
|
-
},
|
|
30
|
-
granola: {
|
|
31
|
-
name: 'granola',
|
|
32
|
-
label: 'Granola',
|
|
33
|
-
description: 'Granola — search and read AI-summarized meeting notes',
|
|
34
|
-
type: 'stdio',
|
|
35
|
-
command: 'npx',
|
|
36
|
-
args: ['-y', 'granola-mcp'],
|
|
37
|
-
// No credential fields — Granola reads auth from the installed Granola app
|
|
38
|
-
credentialFields: [],
|
|
39
|
-
docsUrl: 'https://granola.ai',
|
|
40
|
-
},
|
|
41
|
-
slack: {
|
|
42
|
-
name: 'slack',
|
|
43
|
-
label: 'Slack',
|
|
44
|
-
description: 'Slack — search messages, list channels, post updates',
|
|
45
|
-
type: 'stdio',
|
|
46
|
-
command: 'npx',
|
|
47
|
-
args: ['-y', '@modelcontextprotocol/server-slack'],
|
|
48
|
-
credentialFields: [
|
|
49
|
-
{
|
|
50
|
-
key: 'env.SLACK_BOT_TOKEN',
|
|
51
|
-
label: 'Slack token',
|
|
52
|
-
description: 'Bot token (xoxb-...) or User OAuth token (xoxp-...). ' +
|
|
53
|
-
'Create at: api.slack.com/apps → OAuth & Permissions',
|
|
54
|
-
secret: true,
|
|
55
|
-
required: true,
|
|
56
|
-
placeholder: 'xoxb-...',
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
docsUrl: 'https://api.slack.com/authentication/token-types',
|
|
60
|
-
},
|
|
61
|
-
pipedrive: {
|
|
62
|
-
name: 'pipedrive',
|
|
63
|
-
label: 'Pipedrive',
|
|
64
|
-
description: 'Pipedrive CRM — contacts, deals, activities, pipeline',
|
|
65
|
-
type: 'stdio',
|
|
66
|
-
command: 'npx',
|
|
67
|
-
args: ['-y', '@modelcontextprotocol/server-pipedrive'],
|
|
68
|
-
credentialFields: [
|
|
69
|
-
{
|
|
70
|
-
key: 'env.PIPEDRIVE_API_TOKEN',
|
|
71
|
-
label: 'Pipedrive API token',
|
|
72
|
-
description: 'Settings → Personal preferences → API → Your personal API token',
|
|
73
|
-
secret: true,
|
|
74
|
-
required: true,
|
|
75
|
-
placeholder: 'your-api-token',
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
docsUrl: 'https://developers.pipedrive.com/docs/api/v1',
|
|
79
|
-
},
|
|
80
|
-
gdrive: {
|
|
81
|
-
name: 'gdrive',
|
|
82
|
-
label: 'Google Drive',
|
|
83
|
-
description: 'Google Drive — search and read files, docs, sheets, slides',
|
|
84
|
-
type: 'stdio',
|
|
85
|
-
command: 'npx',
|
|
86
|
-
args: ['-y', '@modelcontextprotocol/server-gdrive'],
|
|
87
|
-
// OAuth flow required — credentials come from GDRIVE_CREDENTIALS_FILE env var
|
|
88
|
-
// pointing to an OAuth2 client_secret.json downloaded from Google Cloud Console.
|
|
89
|
-
// See docsUrl for setup steps.
|
|
90
|
-
credentialFields: [
|
|
91
|
-
{
|
|
92
|
-
key: 'env.GDRIVE_CREDENTIALS_FILE',
|
|
93
|
-
label: 'Path to Google OAuth credentials JSON',
|
|
94
|
-
description: 'Download from: Google Cloud Console → APIs & Services → Credentials → OAuth 2.0 Client',
|
|
95
|
-
secret: false,
|
|
96
|
-
required: true,
|
|
97
|
-
placeholder: '~/.config/google/credentials.json',
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
docsUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/gdrive',
|
|
101
|
-
},
|
|
102
|
-
asana: {
|
|
103
|
-
name: 'asana',
|
|
104
|
-
label: 'Asana',
|
|
105
|
-
description: 'Asana — tasks, projects, workspaces, team assignments',
|
|
106
|
-
type: 'stdio',
|
|
107
|
-
command: 'npx',
|
|
108
|
-
args: ['-y', 'asana-mcp'],
|
|
109
|
-
credentialFields: [
|
|
110
|
-
{
|
|
111
|
-
key: 'env.ASANA_ACCESS_TOKEN',
|
|
112
|
-
label: 'Asana personal access token',
|
|
113
|
-
description: 'My Profile Settings → Apps → Manage Developer Apps → New access token',
|
|
114
|
-
secret: true,
|
|
115
|
-
required: true,
|
|
116
|
-
placeholder: 'your-personal-access-token',
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
docsUrl: 'https://developers.asana.com/docs/personal-access-token',
|
|
120
|
-
},
|
|
121
|
-
figma: {
|
|
122
|
-
name: 'figma',
|
|
123
|
-
label: 'Figma',
|
|
124
|
-
description: 'Figma — read files, components, variables, design tokens',
|
|
125
|
-
type: 'http',
|
|
126
|
-
url: 'https://mcp.figma.com/mcp',
|
|
127
|
-
credentialFields: [
|
|
128
|
-
{
|
|
129
|
-
key: 'token',
|
|
130
|
-
label: 'Figma personal access token',
|
|
131
|
-
description: 'Settings → Account → Personal access tokens → Generate new token',
|
|
132
|
-
secret: true,
|
|
133
|
-
required: true,
|
|
134
|
-
placeholder: 'figd_...',
|
|
135
|
-
},
|
|
136
|
-
],
|
|
137
|
-
docsUrl: 'https://www.figma.com/developers/api#access-tokens',
|
|
138
|
-
},
|
|
22
|
+
linear,
|
|
23
|
+
granola,
|
|
24
|
+
slack,
|
|
25
|
+
pipedrive,
|
|
26
|
+
gdrive,
|
|
27
|
+
asana,
|
|
28
|
+
figma,
|
|
29
|
+
'figma-remote': figmaRemote,
|
|
30
|
+
obsidian,
|
|
139
31
|
};
|
|
140
32
|
//# sourceMappingURL=definitions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/mcp/connectors/definitions.ts"],"names":[],"mappings":"AAAA
|
|
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,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,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,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,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,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,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>;
|
|
@@ -0,0 +1,160 @@
|
|
|
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 { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
14
|
+
import { join } from 'path';
|
|
15
|
+
import { createServer } from 'http';
|
|
16
|
+
import { CONNECTORS_DIR } from './connector-manager.js';
|
|
17
|
+
const CALLBACK_PORT = 38741; // Fixed port for OAuth callbacks
|
|
18
|
+
const CALLBACK_PATH = '/oauth/callback';
|
|
19
|
+
const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
|
|
20
|
+
/**
|
|
21
|
+
* File-backed OAuth provider for a single connector.
|
|
22
|
+
* Stores tokens and client info alongside the connector config.
|
|
23
|
+
*/
|
|
24
|
+
export class ConnectorOAuthProvider {
|
|
25
|
+
connectorName;
|
|
26
|
+
storagePath;
|
|
27
|
+
constructor(connectorName) {
|
|
28
|
+
this.connectorName = connectorName;
|
|
29
|
+
this.storagePath = join(CONNECTORS_DIR, `${connectorName}.oauth.json`);
|
|
30
|
+
}
|
|
31
|
+
get redirectUrl() {
|
|
32
|
+
return new URL(REDIRECT_URI);
|
|
33
|
+
}
|
|
34
|
+
get clientMetadata() {
|
|
35
|
+
return {
|
|
36
|
+
redirect_uris: [REDIRECT_URI],
|
|
37
|
+
client_name: 'Studiograph',
|
|
38
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
39
|
+
response_types: ['code'],
|
|
40
|
+
token_endpoint_auth_method: 'none', // public client — no secret
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async clientInformation() {
|
|
44
|
+
return this._load().clientInfo;
|
|
45
|
+
}
|
|
46
|
+
async saveClientInformation(info) {
|
|
47
|
+
const data = this._load();
|
|
48
|
+
data.clientInfo = info;
|
|
49
|
+
this._save(data);
|
|
50
|
+
}
|
|
51
|
+
async tokens() {
|
|
52
|
+
return this._load().tokens;
|
|
53
|
+
}
|
|
54
|
+
async saveTokens(tokens) {
|
|
55
|
+
const data = this._load();
|
|
56
|
+
data.tokens = tokens;
|
|
57
|
+
this._save(data);
|
|
58
|
+
}
|
|
59
|
+
async redirectToAuthorization(authorizationUrl) {
|
|
60
|
+
// Open browser to authorization URL
|
|
61
|
+
const { exec } = await import('child_process');
|
|
62
|
+
const url = authorizationUrl.toString();
|
|
63
|
+
const platform = process.platform;
|
|
64
|
+
if (platform === 'darwin') {
|
|
65
|
+
exec(`open "${url}"`);
|
|
66
|
+
}
|
|
67
|
+
else if (platform === 'win32') {
|
|
68
|
+
exec(`start "" "${url}"`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
exec(`xdg-open "${url}"`);
|
|
72
|
+
}
|
|
73
|
+
console.log(`[connectors] Opening browser for ${this.connectorName} authorization...`);
|
|
74
|
+
}
|
|
75
|
+
async saveCodeVerifier(codeVerifier) {
|
|
76
|
+
const data = this._load();
|
|
77
|
+
data.codeVerifier = codeVerifier;
|
|
78
|
+
this._save(data);
|
|
79
|
+
}
|
|
80
|
+
async codeVerifier() {
|
|
81
|
+
const data = this._load();
|
|
82
|
+
return data.codeVerifier ?? '';
|
|
83
|
+
}
|
|
84
|
+
async invalidateCredentials(scope) {
|
|
85
|
+
const data = this._load();
|
|
86
|
+
if (scope === 'all' || scope === 'tokens')
|
|
87
|
+
data.tokens = undefined;
|
|
88
|
+
if (scope === 'all' || scope === 'client')
|
|
89
|
+
data.clientInfo = undefined;
|
|
90
|
+
if (scope === 'all' || scope === 'verifier')
|
|
91
|
+
data.codeVerifier = undefined;
|
|
92
|
+
this._save(data);
|
|
93
|
+
}
|
|
94
|
+
// ── storage helpers ──────────────────────────────────────────────────────
|
|
95
|
+
_load() {
|
|
96
|
+
if (!existsSync(this.storagePath))
|
|
97
|
+
return {};
|
|
98
|
+
try {
|
|
99
|
+
return JSON.parse(readFileSync(this.storagePath, 'utf-8'));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
_save(data) {
|
|
106
|
+
mkdirSync(CONNECTORS_DIR, { recursive: true });
|
|
107
|
+
writeFileSync(this.storagePath, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ── Callback server ──────────────────────────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Start a temporary local HTTP server to receive the OAuth callback.
|
|
113
|
+
* Returns a promise that resolves with the authorization code.
|
|
114
|
+
* Server auto-closes after receiving the callback or timing out.
|
|
115
|
+
*/
|
|
116
|
+
export function waitForOAuthCallback(timeoutMs = 120_000) {
|
|
117
|
+
return new Promise((resolve, reject) => {
|
|
118
|
+
let server;
|
|
119
|
+
const timeout = setTimeout(() => {
|
|
120
|
+
server?.close();
|
|
121
|
+
reject(new Error('OAuth callback timed out (2 minutes)'));
|
|
122
|
+
}, timeoutMs);
|
|
123
|
+
server = createServer((req, res) => {
|
|
124
|
+
const url = new URL(req.url ?? '/', `http://localhost:${CALLBACK_PORT}`);
|
|
125
|
+
if (url.pathname !== CALLBACK_PATH) {
|
|
126
|
+
res.writeHead(404);
|
|
127
|
+
res.end('Not found');
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const code = url.searchParams.get('code');
|
|
131
|
+
const error = url.searchParams.get('error');
|
|
132
|
+
if (error) {
|
|
133
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
134
|
+
res.end(`<html><body><h2>Authorization failed</h2><p>${error}</p><p>You can close this tab.</p></body></html>`);
|
|
135
|
+
clearTimeout(timeout);
|
|
136
|
+
server.close();
|
|
137
|
+
reject(new Error(`OAuth authorization denied: ${error}`));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (!code) {
|
|
141
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
142
|
+
res.end('<html><body><h2>Missing authorization code</h2><p>You can close this tab.</p></body></html>');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
146
|
+
res.end('<html><body><h2>Authorization successful</h2><p>You can close this tab and return to Studiograph.</p></body></html>');
|
|
147
|
+
clearTimeout(timeout);
|
|
148
|
+
server.close();
|
|
149
|
+
resolve(code);
|
|
150
|
+
});
|
|
151
|
+
server.listen(CALLBACK_PORT, () => {
|
|
152
|
+
// Server ready — browser will be opened by redirectToAuthorization()
|
|
153
|
+
});
|
|
154
|
+
server.on('error', (err) => {
|
|
155
|
+
clearTimeout(timeout);
|
|
156
|
+
reject(new Error(`Failed to start OAuth callback server: ${err.message}`));
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=oauth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/mcp/oauth-provider.ts"],"names":[],"mappings":"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"}
|