Connector catalog
Sandbox, MCP, knowledge-base, data, Azure, and Databricks connector options.
Fabric Harness connectors are intentionally modular. The core SDK owns the stable agent/session/tool/sandbox contracts; provider packages and project-local adapters own provider SDKs, credentials, lifecycle, and live compatibility.
There are three connector forms:
| Form | Use when | Example |
|---|---|---|
| Package helper | Fabric already ships a dependency-free helper or REST client. | daytonaSandbox, databricksSqlTool, foundryAgentTool |
Recipe via fh add | Provider SDK shape or project conventions need local code. | fh add daytona --print |
| Direct SDK primitive | No connector file is needed. | fumadocsSource, connectMcpServer |
Quickstart for any provider
If no pre-built adapter exists, use fh add <url> --category <kind> and pipe to your coding agent:
fh add https://e2b.dev --category sandbox | claude
fh add https://api.notion.com --category data | cursor-agent
fh add https://docs.linear.app --category mcp | codexThe CLI emits the canonical category spec (sandbox.md, mcp.md, or data.md shipped with @fabric-harness/sdk) along with a "build me a connector for this URL" header. The agent reads the provider's docs, follows the spec literally, and writes a single TypeScript file at ./connectors/<provider>.ts. No PR to fabric-harness needed — the file lives in your project.
When fabric-harness ships a first-party recipe for the provider, prefer the named slug:
fh add daytona | claude
fh add linear-mcp | claudeAuto-PR mode
fh add daytona --pr opens a draft GitHub PR with a stub connector file (committed to a connector/<provider> branch) and the canonical spec embedded in the PR body. You (or your coding agent) push commits that flesh out the stub. Requires the gh CLI and a configured remote.
fh add daytona --pr
fh add https://your-provider.example.com --category sandbox --pr --pr-branch=connector/your-providerValidating connectors
fh doctor --connectors walks connectors/ and .fabricharness/connectors/ and flags files that are missing exports, lack the @fabric-harness/* import, or are otherwise malformed:
fh doctor --connectors
# ✓ connector:daytona.ts: ./connectors/daytona.ts
# ✗ connector:broken.ts: missing @fabric-harness/* import
# ✓ connectors: 1/2 healthyInstall packages
Core connector helpers:
npm install @fabric-harness/sdk @fabric-harness/connectorsCloud-specific packages:
npm install @fabric-harness/azure
npm install @fabric-harness/databricksProvider SDKs stay in your app, not in @fabric-harness/sdk:
npm install @daytona/sdk
npm install @e2b/code-interpreterSandbox connectors
Sandbox connectors adapt remote execution providers to Fabric's SandboxEnv contract: file operations, shell execution, cwd scoping, cleanup, and optional snapshots.
| Connector | Package helper | Recipe | Live gate | Notes |
|---|---|---|---|---|
| Daytona | daytonaSandbox() / daytonaSandboxFactory() from @fabric-harness/connectors | fh add daytona --print | FABRIC_DAYTONA_TEST=1 | Structural wrapper around an initialized Daytona sandbox. |
| E2B | e2bSandbox() | fh add e2b --print | FABRIC_E2B_TEST=1 | Structural wrapper around E2B command/file APIs. |
| Modal | modalSandbox() | fh add modal --print | FABRIC_MODAL_TEST=1 | Modal deployments vary; live test accepts a user-provided adapter module. |
| Vercel Sandbox | Use remoteSandbox() recipe | fh add vercel --print | future | Project-local adapter until SDK compatibility is certified. |
| Custom provider | remoteSandbox() / remoteSandboxEnv() | fh add <url> --category sandbox --print | provider-specific | Keep provider SDK and credentials in project code. |
Daytona example
import { Daytona } from '@daytona/sdk';
import { daytonaSandbox } from '@fabric-harness/connectors';
const client = new Daytona({ apiKey: process.env.DAYTONA_API_KEY });
const remote = await client.create();
const fabric = await init({
sandbox: daytonaSandbox(remote, { cleanup: true }),
});Validate any sandbox adapter
import { validateSandboxAdapter } from '@fabric-harness/connectors';
await validateSandboxAdapter(env);The validator runs a smoke contract: mkdir, writeFile, readFile, exec, and rm.
See Sandbox connectors for the full adapter guide.
MCP connectors
MCP connectors expose remote tools to agents. Use connectMcpServer(name, options) from @fabric-harness/sdk (or /strict if you prefer).
| Connector | Recipe | Pattern |
|---|---|---|
| GitHub MCP | fh add github-mcp --print | Hosted MCP with bearer token. |
| Mintlify MCP | fh add mintlify-mcp --print | Streamable HTTP MCP endpoint for a docs site when available. |
| Linear MCP | fh add linear-mcp --print | Hosted MCP with API token. |
| Slack MCP | fh add slack-mcp --print | Hosted or self-hosted bridge. |
| Custom MCP | fh add <url> --category mcp --print | Reads provider docs and generates a connector. |
Example:
import { connectMcpServer } from '@fabric-harness/sdk';
const github = await connectMcpServer('github', {
url: 'https://mcp.github.com/mcp',
transport: 'streamable-http',
headers: { Authorization: `Bearer ${process.env.GITHUB_TOKEN}` },
});
try {
const session = await (await init({ tools: github.tools })).session();
await session.prompt('Find open issues tagged bug.');
} finally {
await github.close();
}Knowledge-base connectors
Knowledge-base connectors mount docs/content into a sandbox as files. Agents then use read, grep, and glob instead of a retrieval pipeline.
| Source | Helper | Recipe | Notes |
|---|---|---|---|
| Local Markdown/MDX | localDirectorySource() | none | General local docs. |
| Fumadocs | fumadocsSource() | fh add fumadocs --print | Strips frontmatter by default. |
| Mintlify local checkout | mintlifySource() | none | Includes docs.json nav. |
| HTTP docs | httpFilesystemSource() | none | Fetch URLs into files. |
| Cloudflare R2 | r2FilesystemSource() from @fabric-harness/sdk/cloudflare | docs example | Worker/R2 deployments. |
| S3-compatible | s3FilesystemSource() from @fabric-harness/connectors | none | Structural object-store client. |
| Azure Blob | azureBlobFilesystemSource() from @fabric-harness/connectors | none | Structural blob client. |
Example:
import { agent, fumadocsSource, withFilesystemSources } from '@fabric-harness/sdk';
export default agent<{ question: string }>({
run: async ({ init, input }) => {
const sandbox = withFilesystemSources('virtual', [{
mountAt: '/workspace/docs',
source: fumadocsSource('./apps/docs/content/docs'),
}]);
const session = await (await init({ sandbox })).session();
return await session.prompt(`Answer using /workspace/docs: ${input.question}`);
},
});Data connectors
Data connectors should expose narrow tools, not raw credentials or arbitrary network access.
| Connector | Package/helper | Recipe | Notes |
|---|---|---|---|
| Postgres | project-local ToolDef/command | fh add postgres --print | Prefer read-only credentials and row/time limits. |
| Notion | hosted MCP or REST command | fh add notion --print | Hosted MCP when available; REST adapter otherwise. |
| Databricks SQL | databricksSqlTool() | see Databricks | SQL Warehouse statements. |
| Databricks Jobs | databricksRunJobTool() | see Databricks | Trigger existing jobs. |
| Unity Catalog | unityCatalogTablesTool() | see Databricks | Read catalog/table metadata. |
| MLflow | databricksMlflowLogMetricTool() / databricksMlflowLogParamTool() | see Databricks | Write run telemetry. |
Azure and Foundry connectors
Azure helpers live in @fabric-harness/azure:
| Helper | Purpose |
|---|---|
AzureOpenAIModelProvider | Azure OpenAI model calls. |
createAzureBlobArtifactStore() | Blob-backed artifacts. |
createAzureKeyVaultSecretResolver() | Runtime secret resolution. |
FoundryAgentServiceClient | Foundry Agent Service REST client. |
foundryAgentTool() | Invoke a Foundry agent from a Fabric agent. |
foundryAgentLifecycleTools() | Create/update/delete Foundry agents as gated tools. |
azureContainerAppsJobTool() | Start existing Container Apps Jobs. |
azureAksRunCommandTool() | AKS Run Command. |
azureContainerInstanceExecTool() | ACI exec-session creation. |
See Azure and Foundry Hosted Agents.
fh add
List recipes:
fh addPrint one:
fh add daytona --print
fh add github-mcp --print
fh add postgres --printGenerate from provider docs:
fh add https://example.com/provider/docs --category sandbox --printCategories:
| Category | Output shape |
|---|---|
sandbox | SandboxEnv / SandboxFactory |
mcp | connectMcpServer() wrapper |
kb | FilesystemSource |
data | ToolDef, Command, or MCP wrapper |
Live tests
Connector live tests are opt-in. See Live tests for the full matrix.
FABRIC_DAYTONA_TEST=1 DAYTONA_API_KEY=... pnpm --filter @fabric-harness/connectors test
FABRIC_AZURE_FOUNDRY_TEST=1 AZURE_FOUNDRY_PROJECT_ENDPOINT=... AZURE_TOKEN=... pnpm --filter @fabric-harness/azure test
FABRIC_DATABRICKS_TEST=1 DATABRICKS_HOST=... DATABRICKS_TOKEN=... pnpm --filter @fabric-harness/databricks testSecurity checklist
- Keep provider credentials in env, managed identity, Key Vault, or secret manager.
- Never put tokens in prompts, payloads, session history, artifacts, or build manifests.
- Prefer read-only credentials for data tools.
- Treat sandbox execution, cloud control-plane actions, and data writes as
execute/writeeffects. - Gate destructive actions with Fabric policy approvals.
- Add unit tests with fake provider objects and live tests behind env gates.