@dobbyai/mcp-external 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -14
- package/dist/__tests__/agent-mail-tools.test.js +19 -26
- package/dist/__tests__/agent-mail-tools.test.js.map +1 -1
- package/dist/__tests__/auth.test.js +50 -5
- package/dist/__tests__/auth.test.js.map +1 -1
- package/dist/__tests__/doctor.test.d.ts +16 -0
- package/dist/__tests__/doctor.test.d.ts.map +1 -0
- package/dist/__tests__/doctor.test.js +258 -0
- package/dist/__tests__/doctor.test.js.map +1 -0
- package/dist/__tests__/external-agents-tools.test.d.ts +11 -0
- package/dist/__tests__/external-agents-tools.test.d.ts.map +1 -0
- package/dist/__tests__/external-agents-tools.test.js +619 -0
- package/dist/__tests__/external-agents-tools.test.js.map +1 -0
- package/dist/__tests__/gateway-bearer.test.d.ts +12 -0
- package/dist/__tests__/gateway-bearer.test.d.ts.map +1 -0
- package/dist/__tests__/gateway-bearer.test.js +112 -0
- package/dist/__tests__/gateway-bearer.test.js.map +1 -0
- package/dist/__tests__/gateway-key-resolver.test.d.ts +10 -0
- package/dist/__tests__/gateway-key-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/gateway-key-resolver.test.js +125 -0
- package/dist/__tests__/gateway-key-resolver.test.js.map +1 -0
- package/dist/__tests__/http-concurrency.test.d.ts +20 -0
- package/dist/__tests__/http-concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/http-concurrency.test.js +254 -0
- package/dist/__tests__/http-concurrency.test.js.map +1 -0
- package/dist/__tests__/integration/protocol.test.js +14 -8
- package/dist/__tests__/integration/protocol.test.js.map +1 -1
- package/dist/__tests__/mcp-integrations.test.js +20 -30
- package/dist/__tests__/mcp-integrations.test.js.map +1 -1
- package/dist/__tests__/memory-graph-tools.test.js +27 -38
- package/dist/__tests__/memory-graph-tools.test.js.map +1 -1
- package/dist/__tests__/registry-dispatch.test.d.ts +11 -0
- package/dist/__tests__/registry-dispatch.test.d.ts.map +1 -0
- package/dist/__tests__/registry-dispatch.test.js +30 -0
- package/dist/__tests__/registry-dispatch.test.js.map +1 -0
- package/dist/__tests__/registry-listing-parity.test.d.ts +2 -0
- package/dist/__tests__/registry-listing-parity.test.d.ts.map +1 -0
- package/dist/__tests__/registry-listing-parity.test.js +89 -0
- package/dist/__tests__/registry-listing-parity.test.js.map +1 -0
- package/dist/__tests__/role-cap.test.d.ts +2 -0
- package/dist/__tests__/role-cap.test.d.ts.map +1 -0
- package/dist/__tests__/role-cap.test.js +113 -0
- package/dist/__tests__/role-cap.test.js.map +1 -0
- package/dist/__tests__/schedule-tools.test.js +15 -20
- package/dist/__tests__/schedule-tools.test.js.map +1 -1
- package/dist/__tests__/server-gateway-key.test.d.ts +18 -0
- package/dist/__tests__/server-gateway-key.test.d.ts.map +1 -0
- package/dist/__tests__/server-gateway-key.test.js +148 -0
- package/dist/__tests__/server-gateway-key.test.js.map +1 -0
- package/dist/__tests__/server-user-scoped.test.d.ts +34 -0
- package/dist/__tests__/server-user-scoped.test.d.ts.map +1 -0
- package/dist/__tests__/server-user-scoped.test.js +577 -0
- package/dist/__tests__/server-user-scoped.test.js.map +1 -0
- package/dist/__tests__/task-id-pattern.test.d.ts +12 -0
- package/dist/__tests__/task-id-pattern.test.d.ts.map +1 -0
- package/dist/__tests__/task-id-pattern.test.js +43 -0
- package/dist/__tests__/task-id-pattern.test.js.map +1 -0
- package/dist/__tests__/tiers.test.js +152 -56
- package/dist/__tests__/tiers.test.js.map +1 -1
- package/dist/__tests__/tools/hosted-agents.test.d.ts +9 -0
- package/dist/__tests__/tools/hosted-agents.test.d.ts.map +1 -0
- package/dist/__tests__/tools/hosted-agents.test.js +301 -0
- package/dist/__tests__/tools/hosted-agents.test.js.map +1 -0
- package/dist/__tests__/tools/llm-providers.test.d.ts +10 -0
- package/dist/__tests__/tools/llm-providers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/llm-providers.test.js +105 -0
- package/dist/__tests__/tools/llm-providers.test.js.map +1 -0
- package/dist/__tests__/tools/services.test.js +139 -98
- package/dist/__tests__/tools/services.test.js.map +1 -1
- package/dist/__tests__/tools.test.js +24 -15
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/__tests__/transport.test.js +365 -23
- package/dist/__tests__/transport.test.js.map +1 -1
- package/dist/__tests__/validate-credentials.test.d.ts +9 -0
- package/dist/__tests__/validate-credentials.test.d.ts.map +1 -0
- package/dist/__tests__/validate-credentials.test.js +172 -0
- package/dist/__tests__/validate-credentials.test.js.map +1 -0
- package/dist/__tests__/web-eval-tools.test.js +21 -32
- package/dist/__tests__/web-eval-tools.test.js.map +1 -1
- package/dist/__tests__/whoami.test.d.ts +11 -0
- package/dist/__tests__/whoami.test.d.ts.map +1 -0
- package/dist/__tests__/whoami.test.js +194 -0
- package/dist/__tests__/whoami.test.js.map +1 -0
- package/dist/__tests__/workflow-tools.test.js +20 -27
- package/dist/__tests__/workflow-tools.test.js.map +1 -1
- package/dist/__tests__/workloads.test.d.ts +9 -0
- package/dist/__tests__/workloads.test.d.ts.map +1 -0
- package/dist/__tests__/workloads.test.js +169 -0
- package/dist/__tests__/workloads.test.js.map +1 -0
- package/dist/auth/token-verifier.d.ts +11 -6
- package/dist/auth/token-verifier.d.ts.map +1 -1
- package/dist/auth/token-verifier.js +41 -19
- package/dist/auth/token-verifier.js.map +1 -1
- package/dist/connectors/claude-desktop.d.ts.map +1 -1
- package/dist/connectors/claude-desktop.js +3 -2
- package/dist/connectors/claude-desktop.js.map +1 -1
- package/dist/connectors/cursor.d.ts.map +1 -1
- package/dist/connectors/cursor.js +3 -2
- package/dist/connectors/cursor.js.map +1 -1
- package/dist/connectors/setup.d.ts.map +1 -1
- package/dist/connectors/setup.js +2 -1
- package/dist/connectors/setup.js.map +1 -1
- package/dist/connectors/vscode.d.ts.map +1 -1
- package/dist/connectors/vscode.js +3 -2
- package/dist/connectors/vscode.js.map +1 -1
- package/dist/connectors/windsurf.d.ts.map +1 -1
- package/dist/connectors/windsurf.js +3 -2
- package/dist/connectors/windsurf.js.map +1 -1
- package/dist/doctor.d.ts +34 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +134 -0
- package/dist/doctor.js.map +1 -0
- package/dist/http-server.d.ts +24 -3
- package/dist/http-server.d.ts.map +1 -1
- package/dist/http-server.js +342 -62
- package/dist/http-server.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +72 -208
- package/dist/index.js.map +1 -1
- package/dist/lib/consts.d.ts +21 -0
- package/dist/lib/consts.d.ts.map +1 -0
- package/dist/lib/consts.js +30 -0
- package/dist/lib/consts.js.map +1 -0
- package/dist/lib/dobby-client.d.ts +50 -23
- package/dist/lib/dobby-client.d.ts.map +1 -1
- package/dist/lib/dobby-client.js +105 -54
- package/dist/lib/dobby-client.js.map +1 -1
- package/dist/lib/gateway-key-resolver.d.ts +38 -0
- package/dist/lib/gateway-key-resolver.d.ts.map +1 -0
- package/dist/lib/gateway-key-resolver.js +59 -0
- package/dist/lib/gateway-key-resolver.js.map +1 -0
- package/dist/lib/log.d.ts +25 -0
- package/dist/lib/log.d.ts.map +1 -0
- package/dist/lib/log.js +36 -0
- package/dist/lib/log.js.map +1 -0
- package/dist/server.d.ts +175 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1017 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/agent-mail.d.ts +0 -41
- package/dist/tools/agent-mail.d.ts.map +1 -1
- package/dist/tools/agent-mail.js +0 -222
- package/dist/tools/agent-mail.js.map +1 -1
- package/dist/tools/agent-versions.d.ts +93 -0
- package/dist/tools/agent-versions.d.ts.map +1 -0
- package/dist/tools/agent-versions.js +99 -0
- package/dist/tools/agent-versions.js.map +1 -0
- package/dist/tools/approvals.d.ts +0 -34
- package/dist/tools/approvals.d.ts.map +1 -1
- package/dist/tools/approvals.js +0 -81
- package/dist/tools/approvals.js.map +1 -1
- package/dist/tools/claude-code-sync.d.ts +40 -0
- package/dist/tools/claude-code-sync.d.ts.map +1 -0
- package/dist/tools/claude-code-sync.js +52 -0
- package/dist/tools/claude-code-sync.js.map +1 -0
- package/dist/tools/control-plane.d.ts +118 -0
- package/dist/tools/control-plane.d.ts.map +1 -0
- package/dist/tools/control-plane.js +135 -0
- package/dist/tools/control-plane.js.map +1 -0
- package/dist/tools/crew-builder.d.ts +0 -66
- package/dist/tools/crew-builder.d.ts.map +1 -1
- package/dist/tools/crew-builder.js +0 -185
- package/dist/tools/crew-builder.js.map +1 -1
- package/dist/tools/crewai.d.ts +0 -63
- package/dist/tools/crewai.d.ts.map +1 -1
- package/dist/tools/crewai.js +0 -145
- package/dist/tools/crewai.js.map +1 -1
- package/dist/tools/exa.d.ts +0 -35
- package/dist/tools/exa.d.ts.map +1 -1
- package/dist/tools/exa.js +0 -103
- package/dist/tools/exa.js.map +1 -1
- package/dist/tools/external-agents.d.ts +440 -0
- package/dist/tools/external-agents.d.ts.map +1 -0
- package/dist/tools/external-agents.js +386 -0
- package/dist/tools/external-agents.js.map +1 -0
- package/dist/tools/github-mcp.d.ts +0 -75
- package/dist/tools/github-mcp.d.ts.map +1 -1
- package/dist/tools/github-mcp.js +0 -162
- package/dist/tools/github-mcp.js.map +1 -1
- package/dist/tools/governance.d.ts +162 -18
- package/dist/tools/governance.d.ts.map +1 -1
- package/dist/tools/governance.js +208 -93
- package/dist/tools/governance.js.map +1 -1
- package/dist/tools/hosted-agents.d.ts +216 -0
- package/dist/tools/hosted-agents.d.ts.map +1 -0
- package/dist/tools/hosted-agents.js +214 -0
- package/dist/tools/hosted-agents.js.map +1 -0
- package/dist/tools/index.d.ts +3933 -1219
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +412 -393
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/jira.d.ts +0 -176
- package/dist/tools/jira.d.ts.map +1 -1
- package/dist/tools/jira.js +0 -365
- package/dist/tools/jira.js.map +1 -1
- package/dist/tools/llm-providers.d.ts +50 -0
- package/dist/tools/llm-providers.d.ts.map +1 -0
- package/dist/tools/llm-providers.js +41 -0
- package/dist/tools/llm-providers.js.map +1 -0
- package/dist/tools/mcp-metrics.d.ts +0 -15
- package/dist/tools/mcp-metrics.d.ts.map +1 -1
- package/dist/tools/mcp-metrics.js +0 -217
- package/dist/tools/mcp-metrics.js.map +1 -1
- package/dist/tools/mcp-tools.d.ts +0 -29
- package/dist/tools/mcp-tools.d.ts.map +1 -1
- package/dist/tools/mcp-tools.js +0 -131
- package/dist/tools/mcp-tools.js.map +1 -1
- package/dist/tools/mem0.d.ts +0 -41
- package/dist/tools/mem0.d.ts.map +1 -1
- package/dist/tools/mem0.js +65 -165
- package/dist/tools/mem0.js.map +1 -1
- package/dist/tools/memory-graph.d.ts +0 -46
- package/dist/tools/memory-graph.d.ts.map +1 -1
- package/dist/tools/memory-graph.js +0 -386
- package/dist/tools/memory-graph.js.map +1 -1
- package/dist/tools/memory-stores.d.ts +141 -0
- package/dist/tools/memory-stores.d.ts.map +1 -0
- package/dist/tools/memory-stores.js +147 -0
- package/dist/tools/memory-stores.js.map +1 -0
- package/dist/tools/messages.d.ts +0 -20
- package/dist/tools/messages.d.ts.map +1 -1
- package/dist/tools/messages.js +0 -49
- package/dist/tools/messages.js.map +1 -1
- package/dist/tools/moltbook.d.ts +0 -236
- package/dist/tools/moltbook.d.ts.map +1 -1
- package/dist/tools/moltbook.js +0 -458
- package/dist/tools/moltbook.js.map +1 -1
- package/dist/tools/monitoring-attribution.d.ts +71 -0
- package/dist/tools/monitoring-attribution.d.ts.map +1 -0
- package/dist/tools/monitoring-attribution.js +74 -0
- package/dist/tools/monitoring-attribution.js.map +1 -0
- package/dist/tools/ops.d.ts +0 -80
- package/dist/tools/ops.d.ts.map +1 -1
- package/dist/tools/ops.js +0 -209
- package/dist/tools/ops.js.map +1 -1
- package/dist/tools/orchestrations.d.ts +109 -0
- package/dist/tools/orchestrations.d.ts.map +1 -0
- package/dist/tools/orchestrations.js +115 -0
- package/dist/tools/orchestrations.js.map +1 -0
- package/dist/tools/outcomes.d.ts +138 -0
- package/dist/tools/outcomes.d.ts.map +1 -0
- package/dist/tools/outcomes.js +136 -0
- package/dist/tools/outcomes.js.map +1 -0
- package/dist/tools/schedules.d.ts +0 -47
- package/dist/tools/schedules.d.ts.map +1 -1
- package/dist/tools/schedules.js +0 -109
- package/dist/tools/schedules.js.map +1 -1
- package/dist/tools/services.d.ts +0 -16
- package/dist/tools/services.d.ts.map +1 -1
- package/dist/tools/services.js +0 -135
- package/dist/tools/services.js.map +1 -1
- package/dist/tools/sessions.d.ts +124 -0
- package/dist/tools/sessions.d.ts.map +1 -0
- package/dist/tools/sessions.js +130 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/setup-status.d.ts +29 -0
- package/dist/tools/setup-status.d.ts.map +1 -0
- package/dist/tools/setup-status.js +35 -0
- package/dist/tools/setup-status.js.map +1 -0
- package/dist/tools/tasks.d.ts +0 -57
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +8 -217
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/tiers.d.ts +23 -7
- package/dist/tools/tiers.d.ts.map +1 -1
- package/dist/tools/tiers.js +180 -79
- package/dist/tools/tiers.js.map +1 -1
- package/dist/tools/unified-agents.d.ts +0 -19
- package/dist/tools/unified-agents.d.ts.map +1 -1
- package/dist/tools/unified-agents.js +2 -103
- package/dist/tools/unified-agents.js.map +1 -1
- package/dist/tools/web-eval.d.ts +0 -43
- package/dist/tools/web-eval.d.ts.map +1 -1
- package/dist/tools/web-eval.js +0 -211
- package/dist/tools/web-eval.js.map +1 -1
- package/dist/tools/workflow.d.ts +0 -66
- package/dist/tools/workflow.d.ts.map +1 -1
- package/dist/tools/workflow.js +2 -409
- package/dist/tools/workflow.js.map +1 -1
- package/dist/tools/workloads.d.ts +81 -0
- package/dist/tools/workloads.d.ts.map +1 -0
- package/dist/tools/workloads.js +81 -0
- package/dist/tools/workloads.js.map +1 -0
- package/package.json +7 -6
- package/dist/tools/knowledge-base.d.ts +0 -144
- package/dist/tools/knowledge-base.d.ts.map +0 -1
- package/dist/tools/knowledge-base.js +0 -179
- package/dist/tools/knowledge-base.js.map +0 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ This will guide you through connecting Dobby to your preferred AI tools.
|
|
|
14
14
|
|
|
15
15
|
### Option 2: Manual Setup
|
|
16
16
|
|
|
17
|
-
1. Get your API credentials from [Dobby Dashboard](https://
|
|
17
|
+
1. Get your API credentials from [Dobby Dashboard](https://dobby-ai.com/settings/api)
|
|
18
18
|
2. Add to your MCP client config:
|
|
19
19
|
|
|
20
20
|
```json
|
|
@@ -24,8 +24,8 @@ This will guide you through connecting Dobby to your preferred AI tools.
|
|
|
24
24
|
"command": "npx",
|
|
25
25
|
"args": ["-y", "@dobbyai/mcp-external"],
|
|
26
26
|
"env": {
|
|
27
|
-
"DOBBY_API_URL": "https://
|
|
28
|
-
"DOBBY_API_KEY": "
|
|
27
|
+
"DOBBY_API_URL": "https://dobby-ai.com",
|
|
28
|
+
"DOBBY_API_KEY": "gk_user_your_key_here",
|
|
29
29
|
"DOBBY_TENANT_ID": "your-tenant-id"
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -255,8 +255,8 @@ approvals://pending # Pending approvals
|
|
|
255
255
|
"command": "npx",
|
|
256
256
|
"args": ["-y", "@dobbyai/mcp-external"],
|
|
257
257
|
"env": {
|
|
258
|
-
"DOBBY_API_URL": "https://
|
|
259
|
-
"DOBBY_API_KEY": "
|
|
258
|
+
"DOBBY_API_URL": "https://dobby-ai.com",
|
|
259
|
+
"DOBBY_API_KEY": "gk_user_your_key_here",
|
|
260
260
|
"DOBBY_TENANT_ID": "your-tenant-id"
|
|
261
261
|
}
|
|
262
262
|
}
|
|
@@ -274,8 +274,8 @@ Settings → MCP → Add Server:
|
|
|
274
274
|
"command": "npx",
|
|
275
275
|
"args": ["-y", "@dobbyai/mcp-external"],
|
|
276
276
|
"env": {
|
|
277
|
-
"DOBBY_API_URL": "https://
|
|
278
|
-
"DOBBY_API_KEY": "
|
|
277
|
+
"DOBBY_API_URL": "https://dobby-ai.com",
|
|
278
|
+
"DOBBY_API_KEY": "gk_user_your_key_here",
|
|
279
279
|
"DOBBY_TENANT_ID": "your-tenant-id"
|
|
280
280
|
}
|
|
281
281
|
}
|
|
@@ -293,8 +293,8 @@ File: `~/.codeium/windsurf/mcp_config.json`
|
|
|
293
293
|
"command": "npx",
|
|
294
294
|
"args": ["-y", "@dobbyai/mcp-external"],
|
|
295
295
|
"env": {
|
|
296
|
-
"DOBBY_API_URL": "https://
|
|
297
|
-
"DOBBY_API_KEY": "
|
|
296
|
+
"DOBBY_API_URL": "https://dobby-ai.com",
|
|
297
|
+
"DOBBY_API_KEY": "gk_user_your_key_here",
|
|
298
298
|
"DOBBY_TENANT_ID": "your-tenant-id"
|
|
299
299
|
}
|
|
300
300
|
}
|
|
@@ -313,8 +313,8 @@ Command Palette → "Cline: Open MCP Settings" → Add:
|
|
|
313
313
|
"command": "npx",
|
|
314
314
|
"args": ["-y", "@dobbyai/mcp-external"],
|
|
315
315
|
"env": {
|
|
316
|
-
"DOBBY_API_URL": "https://
|
|
317
|
-
"DOBBY_API_KEY": "
|
|
316
|
+
"DOBBY_API_URL": "https://dobby-ai.com",
|
|
317
|
+
"DOBBY_API_KEY": "gk_user_your_key_here",
|
|
318
318
|
"DOBBY_TENANT_ID": "your-tenant-id"
|
|
319
319
|
}
|
|
320
320
|
}
|
|
@@ -328,11 +328,41 @@ Command Palette → "Cline: Open MCP Settings" → Add:
|
|
|
328
328
|
|
|
329
329
|
| Variable | Required | Description |
|
|
330
330
|
|----------|----------|-------------|
|
|
331
|
-
| `DOBBY_API_URL` | Yes | Dobby API URL (default: https://
|
|
332
|
-
| `DOBBY_API_KEY` | Yes | Your Dobby
|
|
331
|
+
| `DOBBY_API_URL` | Yes | Dobby API URL (default: https://dobby-ai.com) |
|
|
332
|
+
| `DOBBY_API_KEY` | Yes | Your Dobby key: a `gk_user_`/`gk_svc_` gateway key, an `sk_live_` tenant key, or (remote HTTP transport only) a `dobby_pat_` Personal Access Token. See **Credentials & Transports** below. |
|
|
333
333
|
| `DOBBY_TENANT_ID` | Yes | Your workspace/tenant ID |
|
|
334
|
+
| `DOBBY_ORGANIZATION_ID` | No | Organization ID for org-scoped tools (memory stores, rubrics, orchestration configs). The variable name is `DOBBY_ORGANIZATION_ID` — a `DOBBY_ORG_ID` variable is **not** read and is silently ignored. |
|
|
334
335
|
| `DOBBY_USER_ID` | No | User ID for messages |
|
|
335
336
|
| `DOBBY_USER_NAME` | No | Display name for messages |
|
|
337
|
+
| `DOBBY_GATEWAY_KEY` | No | Optional — auto-detected if DOBBY_API_KEY starts with gk_; set explicitly to override. |
|
|
338
|
+
| `DOBBY_GATEWAY_URL` | No | Optional — defaults to DOBBY_API_URL. |
|
|
339
|
+
| `DOBBY_REGION` | No | Optional — data-residency region hint. |
|
|
340
|
+
|
|
341
|
+
> **Not sure what your key can do or which org/tenant you're on?** Run `npx @dobbyai/mcp-external --doctor` before connecting, or — once connected — call the **`whoami`** tool. Both report your transport, key type, resolved org/tenant, whether a PAT is present, and exactly what (if anything) is missing.
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## 🔑 Credentials & Transports
|
|
346
|
+
|
|
347
|
+
Dobby MCP runs in two transports, and which credential you need depends on which one you use. Run `npx @dobbyai/mcp-external --doctor` at any time to check your setup — it prints exactly what your credentials can and cannot do.
|
|
348
|
+
|
|
349
|
+
### Local (STDIO)
|
|
350
|
+
|
|
351
|
+
The default (`npx @dobbyai/mcp-external`), used by Claude Desktop, Cursor, Windsurf, etc. Configured with env vars:
|
|
352
|
+
|
|
353
|
+
| `DOBBY_API_KEY` value | Read / tenant tools | Gateway / execute tools |
|
|
354
|
+
|-----------------------|:-------------------:|:-----------------------:|
|
|
355
|
+
| `gk_user_…` / `gk_svc_…` (gateway key) | ✅ | ✅ — auto-enabled; a `gk_` key doubles as the gateway key |
|
|
356
|
+
| `sk_live_…` (tenant key) | ✅ | ❌ — also set a `gk_` key in `DOBBY_GATEWAY_KEY` |
|
|
357
|
+
| `dobby_pat_…` (Personal Access Token) | ✅ | ❌ — **not available in STDIO** (see below) |
|
|
358
|
+
|
|
359
|
+
**Gateway/execute tools in STDIO need a `gk_` key** — either as `DOBBY_API_KEY` or as `DOBBY_GATEWAY_KEY`. A Personal Access Token (`dobby_pat_`) **cannot** drive gateway tools locally: minting the short-lived gateway key it would need requires an internal secret that only exists on Dobby-operated servers, never on a customer machine — by design.
|
|
360
|
+
|
|
361
|
+
### Remote (HTTP / OAuth)
|
|
362
|
+
|
|
363
|
+
Point an MCP client at `https://mcp.dobby-ai.com` and authenticate with OAuth or a Personal Access Token (`dobby_pat_`). Here a **single PAT covers everything** — read, tenant, org, and gateway tools — because the server mints a per-request, tenant-scoped `gk_tmp_` from your session on your behalf. No separate gateway key to manage.
|
|
364
|
+
|
|
365
|
+
> **Rule of thumb:** local STDIO → use a `gk_user_` key (works for both read and execute). Remote → use a PAT (one credential, gateway included).
|
|
336
366
|
|
|
337
367
|
---
|
|
338
368
|
|
|
@@ -534,7 +564,7 @@ npm test
|
|
|
534
564
|
```bash
|
|
535
565
|
# Set environment variables
|
|
536
566
|
export DOBBY_API_URL=http://localhost:3000
|
|
537
|
-
export DOBBY_API_KEY=dev
|
|
567
|
+
export DOBBY_API_KEY=gk_user_your_key_here # local dev server only (auth bypassed)
|
|
538
568
|
export DOBBY_TENANT_ID=your-tenant-id
|
|
539
569
|
|
|
540
570
|
# Run the server
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* digital identity management, dynamic registry, and markdown responses.
|
|
6
6
|
*/
|
|
7
7
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
8
|
+
import { createRegistry, toMcpResult } from '@dobbyai/capability-core';
|
|
8
9
|
// Mock global fetch
|
|
9
10
|
const mockFetch = vi.fn();
|
|
10
11
|
vi.stubGlobal('fetch', mockFetch);
|
|
@@ -15,6 +16,10 @@ const mockClient = {
|
|
|
15
16
|
tenantId: 'tenant_test123',
|
|
16
17
|
request: vi.fn(),
|
|
17
18
|
};
|
|
19
|
+
// ADR-019: the legacy handle* functions are gone — dispatch goes through the
|
|
20
|
+
// capability registry (handlers are verbatim copies; MCP output byte-identical).
|
|
21
|
+
const registry = createRegistry();
|
|
22
|
+
const callCap = async (id, client, args) => toMcpResult(await registry.get(id).handler({ client: client }, args));
|
|
18
23
|
// ============================================
|
|
19
24
|
// Send Notification
|
|
20
25
|
// ============================================
|
|
@@ -25,10 +30,9 @@ describe('AgentMail: Send Notification', () => {
|
|
|
25
30
|
mockClient.request.mockRejectedValue(new Error('Connection refused'));
|
|
26
31
|
});
|
|
27
32
|
it('sends notification and returns markdown response', async () => {
|
|
28
|
-
const { handleAgentMailSendNotification } = await import('../tools/agent-mail.js');
|
|
29
33
|
// API unavailable — local-only storage
|
|
30
34
|
mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
|
|
31
|
-
const result = await
|
|
35
|
+
const result = await callCap('agentmail_send_notification', mockClient, {
|
|
32
36
|
to: 'dobby-backend-agent',
|
|
33
37
|
subject: 'Task completed',
|
|
34
38
|
body: 'The API endpoint has been implemented successfully.',
|
|
@@ -41,9 +45,8 @@ describe('AgentMail: Send Notification', () => {
|
|
|
41
45
|
expect(text).toContain('**API Delivered:** No');
|
|
42
46
|
});
|
|
43
47
|
it('sends with custom type and priority', async () => {
|
|
44
|
-
const { handleAgentMailSendNotification } = await import('../tools/agent-mail.js');
|
|
45
48
|
mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
|
|
46
|
-
const result = await
|
|
49
|
+
const result = await callCap('agentmail_send_notification', mockClient, {
|
|
47
50
|
to: 'team',
|
|
48
51
|
subject: 'Urgent: Security Vulnerability',
|
|
49
52
|
body: 'Critical security issue found in auth module.',
|
|
@@ -57,12 +60,11 @@ describe('AgentMail: Send Notification', () => {
|
|
|
57
60
|
expect(text).toContain('**Task:** task_abc123');
|
|
58
61
|
});
|
|
59
62
|
it('delivers via API when available', async () => {
|
|
60
|
-
const { handleAgentMailSendNotification } = await import('../tools/agent-mail.js');
|
|
61
63
|
mockFetch.mockResolvedValueOnce({
|
|
62
64
|
ok: true,
|
|
63
65
|
json: () => Promise.resolve({ id: 'api_notif_123', delivered: true }),
|
|
64
66
|
});
|
|
65
|
-
const result = await
|
|
67
|
+
const result = await callCap('agentmail_send_notification', mockClient, {
|
|
66
68
|
to: 'dobby-frontend-agent',
|
|
67
69
|
subject: 'PR Ready for Review',
|
|
68
70
|
body: 'Please review the frontend changes.',
|
|
@@ -79,9 +81,8 @@ describe('AgentMail: Send Notification', () => {
|
|
|
79
81
|
}));
|
|
80
82
|
});
|
|
81
83
|
it('includes email_requested flag', async () => {
|
|
82
|
-
const { handleAgentMailSendNotification } = await import('../tools/agent-mail.js');
|
|
83
84
|
mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
|
|
84
|
-
const result = await
|
|
85
|
+
const result = await callCap('agentmail_send_notification', mockClient, {
|
|
85
86
|
to: 'user@example.com',
|
|
86
87
|
subject: 'Status Report',
|
|
87
88
|
body: 'Weekly status update.',
|
|
@@ -100,7 +101,6 @@ describe('AgentMail: Get Inbox', () => {
|
|
|
100
101
|
mockClient.request.mockRejectedValue(new Error('Connection refused'));
|
|
101
102
|
});
|
|
102
103
|
it('returns inbox from API when available', async () => {
|
|
103
|
-
const { handleAgentMailGetInbox } = await import('../tools/agent-mail.js');
|
|
104
104
|
mockFetch.mockResolvedValueOnce({
|
|
105
105
|
ok: true,
|
|
106
106
|
json: () => Promise.resolve({
|
|
@@ -110,15 +110,14 @@ describe('AgentMail: Get Inbox', () => {
|
|
|
110
110
|
total: 1,
|
|
111
111
|
}),
|
|
112
112
|
});
|
|
113
|
-
const result = await
|
|
113
|
+
const result = await callCap('agentmail_get_inbox', mockClient, {});
|
|
114
114
|
const data = JSON.parse(result.content[0].text);
|
|
115
115
|
expect(data.notifications).toBeDefined();
|
|
116
116
|
});
|
|
117
117
|
it('falls back to local store with markdown format when API unavailable', async () => {
|
|
118
|
-
const { handleAgentMailGetInbox } = await import('../tools/agent-mail.js');
|
|
119
118
|
// Both fetch (inbox API) and request (registry) fail
|
|
120
119
|
mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
|
|
121
|
-
const result = await
|
|
120
|
+
const result = await callCap('agentmail_get_inbox', mockClient, {
|
|
122
121
|
agent_id: 'dobby-backend-agent',
|
|
123
122
|
});
|
|
124
123
|
const text = result.content[0].text;
|
|
@@ -127,26 +126,24 @@ describe('AgentMail: Get Inbox', () => {
|
|
|
127
126
|
expect(text).toContain('**Source:** local store');
|
|
128
127
|
});
|
|
129
128
|
it('respects limit parameter', async () => {
|
|
130
|
-
const { handleAgentMailGetInbox } = await import('../tools/agent-mail.js');
|
|
131
129
|
mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
|
|
132
|
-
const result = await
|
|
130
|
+
const result = await callCap('agentmail_get_inbox', mockClient, {
|
|
133
131
|
limit: 5,
|
|
134
132
|
});
|
|
135
133
|
// Should not error
|
|
136
134
|
expect(result.content[0].text).toContain('## Inbox for');
|
|
137
135
|
});
|
|
138
136
|
it('includes team notifications in inbox', async () => {
|
|
139
|
-
const { handleAgentMailSendNotification, handleAgentMailGetInbox } = await import('../tools/agent-mail.js');
|
|
140
137
|
// Send a team notification first
|
|
141
138
|
mockFetch.mockRejectedValue(new Error('Connection refused'));
|
|
142
|
-
await
|
|
139
|
+
await callCap('agentmail_send_notification', mockClient, {
|
|
143
140
|
to: 'team',
|
|
144
141
|
subject: 'Team Update',
|
|
145
142
|
body: 'Important team update.',
|
|
146
143
|
notification_type: 'status_report',
|
|
147
144
|
});
|
|
148
145
|
// Check inbox for team — should see team notifications
|
|
149
|
-
const result = await
|
|
146
|
+
const result = await callCap('agentmail_get_inbox', mockClient, {
|
|
150
147
|
agent_id: 'team',
|
|
151
148
|
unread_only: false,
|
|
152
149
|
});
|
|
@@ -162,7 +159,6 @@ describe('AgentMail: Get Identity (Dynamic Registry)', () => {
|
|
|
162
159
|
vi.resetAllMocks();
|
|
163
160
|
});
|
|
164
161
|
it('returns identity from API when available', async () => {
|
|
165
|
-
const { handleAgentMailGetIdentity } = await import('../tools/agent-mail.js');
|
|
166
162
|
mockClient.request.mockResolvedValueOnce({
|
|
167
163
|
data: {
|
|
168
164
|
agents: [
|
|
@@ -176,7 +172,7 @@ describe('AgentMail: Get Identity (Dynamic Registry)', () => {
|
|
|
176
172
|
],
|
|
177
173
|
},
|
|
178
174
|
});
|
|
179
|
-
const result = await
|
|
175
|
+
const result = await callCap('agentmail_get_identity', mockClient, {
|
|
180
176
|
agent_id: 'dobby-backend-agent',
|
|
181
177
|
});
|
|
182
178
|
const text = result.content[0].text;
|
|
@@ -186,10 +182,9 @@ describe('AgentMail: Get Identity (Dynamic Registry)', () => {
|
|
|
186
182
|
expect(text).toContain('### Capabilities');
|
|
187
183
|
});
|
|
188
184
|
it('falls back to hardcoded defaults when API unavailable', async () => {
|
|
189
|
-
const { handleAgentMailGetIdentity } = await import('../tools/agent-mail.js');
|
|
190
185
|
// Force cache miss by using a fresh mock that always rejects
|
|
191
186
|
mockClient.request.mockRejectedValue(new Error('Connection refused'));
|
|
192
|
-
const result = await
|
|
187
|
+
const result = await callCap('agentmail_get_identity', mockClient, {
|
|
193
188
|
agent_id: 'dobby-backend-agent',
|
|
194
189
|
});
|
|
195
190
|
expect(result.isError).toBeUndefined();
|
|
@@ -199,9 +194,8 @@ describe('AgentMail: Get Identity (Dynamic Registry)', () => {
|
|
|
199
194
|
expect(text).toContain('### Capabilities');
|
|
200
195
|
});
|
|
201
196
|
it('returns error for unknown agent', async () => {
|
|
202
|
-
const { handleAgentMailGetIdentity } = await import('../tools/agent-mail.js');
|
|
203
197
|
mockClient.request.mockRejectedValueOnce(new Error('Connection refused'));
|
|
204
|
-
const result = await
|
|
198
|
+
const result = await callCap('agentmail_get_identity', mockClient, {
|
|
205
199
|
agent_id: 'nonexistent-agent',
|
|
206
200
|
});
|
|
207
201
|
expect(result.isError).toBe(true);
|
|
@@ -211,7 +205,6 @@ describe('AgentMail: Get Identity (Dynamic Registry)', () => {
|
|
|
211
205
|
expect(data.available_agents).toContain('dobby-backend-agent');
|
|
212
206
|
});
|
|
213
207
|
it('caches API results for 5 minutes', async () => {
|
|
214
|
-
const { handleAgentMailGetIdentity } = await import('../tools/agent-mail.js');
|
|
215
208
|
const apiResponse = {
|
|
216
209
|
data: {
|
|
217
210
|
agents: [
|
|
@@ -221,10 +214,10 @@ describe('AgentMail: Get Identity (Dynamic Registry)', () => {
|
|
|
221
214
|
};
|
|
222
215
|
mockClient.request.mockResolvedValue(apiResponse);
|
|
223
216
|
// First call — fetches from API
|
|
224
|
-
await
|
|
217
|
+
await callCap('agentmail_get_identity', mockClient, { agent_id: 'dobby-chief-agent' });
|
|
225
218
|
// Second call — should use cache (request not called again for registry)
|
|
226
219
|
const callCountAfterFirst = mockClient.request.mock.calls.length;
|
|
227
|
-
await
|
|
220
|
+
await callCap('agentmail_get_identity', mockClient, { agent_id: 'dobby-chief-agent' });
|
|
228
221
|
// Should NOT have made another request (cached)
|
|
229
222
|
expect(mockClient.request.mock.calls.length).toBe(callCountAfterFirst);
|
|
230
223
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-mail-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-mail-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-mail-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-mail-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Tests for OAuth proxy provider and token verifier.
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { InvalidTokenError, ServerError, } from '@modelcontextprotocol/sdk/server/auth/errors.js';
|
|
7
8
|
import { TokenVerifier } from '../auth/token-verifier.js';
|
|
8
9
|
import { createOAuthProvider } from '../auth/oauth-provider.js';
|
|
9
10
|
describe('TokenVerifier', () => {
|
|
@@ -48,29 +49,73 @@ describe('TokenVerifier', () => {
|
|
|
48
49
|
await verifier.verifyAccessToken('dobby_at_cached_token');
|
|
49
50
|
expect(fetch).toHaveBeenCalledTimes(1);
|
|
50
51
|
});
|
|
51
|
-
it('throws on invalid/expired token (401)', async () => {
|
|
52
|
+
it('throws InvalidTokenError on invalid/expired token (401) — maps to HTTP 401, not 500', async () => {
|
|
52
53
|
global.fetch = vi.fn().mockResolvedValue({
|
|
53
54
|
ok: false,
|
|
54
55
|
status: 401,
|
|
55
56
|
});
|
|
56
57
|
await expect(verifier.verifyAccessToken('dobby_at_bad'))
|
|
57
58
|
.rejects.toThrow('Invalid or expired access token');
|
|
59
|
+
await expect(verifier.verifyAccessToken('dobby_at_bad'))
|
|
60
|
+
.rejects.toBeInstanceOf(InvalidTokenError);
|
|
58
61
|
});
|
|
59
|
-
it('throws on inactive token', async () => {
|
|
62
|
+
it('throws InvalidTokenError on inactive token (RFC 7662 active:false)', async () => {
|
|
60
63
|
global.fetch = vi.fn().mockResolvedValue({
|
|
61
64
|
ok: true,
|
|
62
65
|
json: () => Promise.resolve({ active: false }),
|
|
63
66
|
});
|
|
64
67
|
await expect(verifier.verifyAccessToken('dobby_at_inactive'))
|
|
65
|
-
.rejects.toThrow('
|
|
68
|
+
.rejects.toThrow('Invalid or expired access token');
|
|
69
|
+
await expect(verifier.verifyAccessToken('dobby_at_inactive'))
|
|
70
|
+
.rejects.toBeInstanceOf(InvalidTokenError);
|
|
66
71
|
});
|
|
67
|
-
it('throws when token missing org_id or tenant_id', async () => {
|
|
72
|
+
it('throws InvalidTokenError when token missing org_id or tenant_id', async () => {
|
|
68
73
|
global.fetch = vi.fn().mockResolvedValue({
|
|
69
74
|
ok: true,
|
|
70
75
|
json: () => Promise.resolve({ active: true, user_id: 'u1' }),
|
|
71
76
|
});
|
|
72
77
|
await expect(verifier.verifyAccessToken('dobby_at_no_context'))
|
|
73
|
-
.rejects.toThrow('
|
|
78
|
+
.rejects.toThrow('not bound to a tenant');
|
|
79
|
+
await expect(verifier.verifyAccessToken('dobby_at_no_context'))
|
|
80
|
+
.rejects.toBeInstanceOf(InvalidTokenError);
|
|
81
|
+
});
|
|
82
|
+
it('accepts a user-scoped PAT with no tenant/org pin (ADR-020) and carries the aggregate role', async () => {
|
|
83
|
+
global.fetch = vi.fn().mockResolvedValue({
|
|
84
|
+
ok: true,
|
|
85
|
+
json: () => Promise.resolve({
|
|
86
|
+
active: true,
|
|
87
|
+
user_id: 'pu_pat_user',
|
|
88
|
+
org_id: null,
|
|
89
|
+
tenant_id: null,
|
|
90
|
+
user_scoped: true,
|
|
91
|
+
scope: 'mcp:read mcp:execute mcp:*',
|
|
92
|
+
client_id: 'key_pat1',
|
|
93
|
+
exp: Math.floor(Date.now() / 1000) + 3600,
|
|
94
|
+
// aggregate (max) role across all memberships
|
|
95
|
+
tenant_role: 'tenant_owner',
|
|
96
|
+
org_role: 'org_owner',
|
|
97
|
+
is_super_admin: false,
|
|
98
|
+
}),
|
|
99
|
+
});
|
|
100
|
+
const authInfo = await verifier.verifyAccessToken('dobby_pat_usertoken');
|
|
101
|
+
// The tenant-less token is admitted BECAUSE it is user_scoped.
|
|
102
|
+
expect(authInfo.extra?.user_scoped).toBe(true);
|
|
103
|
+
expect(authInfo.extra?.tenant_id).toBeNull();
|
|
104
|
+
expect(authInfo.extra?.org_id).toBeNull();
|
|
105
|
+
// Aggregate role flows through the SAME extra.tenant_role plumbing that
|
|
106
|
+
// ListTools/CallTool gating already reads — no ListTools change needed.
|
|
107
|
+
expect(authInfo.extra?.tenant_role).toBe('tenant_owner');
|
|
108
|
+
expect(authInfo.extra?.is_super_admin).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
it('throws ServerError on unexpected introspection failure (e.g. 500)', async () => {
|
|
111
|
+
global.fetch = vi.fn().mockResolvedValue({
|
|
112
|
+
ok: false,
|
|
113
|
+
status: 500,
|
|
114
|
+
});
|
|
115
|
+
await expect(verifier.verifyAccessToken('dobby_at_backend_down'))
|
|
116
|
+
.rejects.toThrow('Token validation failed (500)');
|
|
117
|
+
await expect(verifier.verifyAccessToken('dobby_at_backend_down'))
|
|
118
|
+
.rejects.toBeInstanceOf(ServerError);
|
|
74
119
|
});
|
|
75
120
|
it('evicts oldest entry when cache exceeds max size', async () => {
|
|
76
121
|
global.fetch = vi.fn().mockResolvedValue({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAa,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,QAAuB,CAAC;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;QACrD,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG;QACzB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE,aAAa;QACxB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;KAC1C,CAAC;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACvC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAChD,CAAQ,CAAC;QAEV,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;QAE1E,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACvC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAChD,CAAQ,CAAC;QAEV,yBAAyB;QACzB,MAAM,QAAQ,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEvC,yBAAyB;QACzB,MAAM,QAAQ,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dobby-mcp doctor — preflight credential/transport diagnosis tests.
|
|
3
|
+
*
|
|
4
|
+
* classifyApiKey is a PURE prefix classifier (no I/O) — tested directly, with a
|
|
5
|
+
* hard assertion that it never leaks more than the first 8 chars of the key.
|
|
6
|
+
*
|
|
7
|
+
* runDoctor orchestrates the live checks: it mocks createDobbyClient (health)
|
|
8
|
+
* and resolveGatewayKey (client-side gateway-key resolution) so we can drive
|
|
9
|
+
* every branch — blocked vs ready, health skipped vs called, and the
|
|
10
|
+
* transport-dependent gateway-tools messaging (http mints per request, stdio
|
|
11
|
+
* needs a static gk_ key). Env (DOBBY_API_KEY / DOBBY_TENANT_ID /
|
|
12
|
+
* DOBBY_GATEWAY_KEY) is reset around every test so a stray shell/CI value can't
|
|
13
|
+
* bleed into a case.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=doctor.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/doctor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|