Fabric MCP Gateway
Use Fabric as a unified MCP server from Claude Desktop, Cursor, VS Code, and any MCP-compatible client. Access all your projects, documents, workspaces, workflows, and connected tools through a single endpoint.
The Fabric MCP Gateway turns your entire Fabric instance into a single MCP server. Instead of configuring each tool separately in every AI client, you connect once to Fabric and get access to everything — your projects, documents, workspaces, workflows, and all your connected MCP servers — through one URL.
Why Use the Gateway?
| Without Gateway | With Gateway |
|---|---|
| Configure each MCP server separately in each client | One URL in your client config |
| Manage API keys per tool per client | Fabric manages all credentials centrally |
| OAuth flows broken in most clients | Fabric handles OAuth + token refresh |
| No visibility across project artifacts | Full access to projects, docs, workspaces |
| Credentials scattered in config files | Credentials encrypted in Fabric, never leave the server |
| No usage controls | Time-limited, human-approved runtime authority |
Quick Setup
1. Create an API Key
Go to Settings → API Keys and create a new key. Copy the key — it starts with fab_.
For organization context, create the key from your organization settings page.
2. Configure Your Client
Edit your claude_desktop_config.json:
{
"mcpServers": {
"fabric": {
"url": "https://your-fabric.com/api/mcp-gateway",
"headers": {
"Authorization": "Bearer fab_xxxx_xxxxxxxxxx"
}
}
}
}Go to Settings → MCP Servers → Add Server:
- Name: Fabric
- URL:
https://your-fabric.com/api/mcp-gateway - Headers:
Authorization: Bearer fab_xxxx_xxxxxxxxxx
Add to your MCP configuration:
{
"servers": {
"fabric": {
"url": "https://your-fabric.com/api/mcp-gateway",
"headers": {
"Authorization": "Bearer fab_xxxx_xxxxxxxxxx"
}
}
}
}Any MCP-compatible client can connect using the Streamable HTTP transport:
Endpoint: POST https://your-fabric.com/api/mcp-gateway
Auth: Authorization: Bearer fab_xxxx_xxxxxxxxxx
Protocol: MCP 2025-03-26 (Streamable HTTP)Health check: GET /api/mcp-gateway returns server info (no auth needed).
3. Organization Context (Optional)
To scope all tools to a specific organization, add the X-Organization-Id header:
{
"headers": {
"Authorization": "Bearer fab_xxxx_xxxxxxxxxx",
"X-Organization-Id": "your-org-id"
}
}Or use fabric_switch_organization after connecting to switch context dynamically.
Coding Instructions
A project's Coding Instructions tab publishes one version of its skills, agents, rules,
and setup files, and serves them to a connected client over the tools below. Rather than
building the configuration above by hand, open that tab and click Connect your agent: it
mints a read-only key (the mcp:read scope, which covers every read-only platform tool,
these three included) and shows the same configuration block.
Project readers can propose adding, editing, or deleting a file from the Coding Instructions tab. Proposals pass the same validation and secret scanning as uploads before an instruction editor can review their changes and approve publication. Rejecting a proposal leaves the published files unchanged. If the published version changes before approval, submit the proposal again against the current version. You can cancel your own proposals once validation is no longer running. Each project allows up to 25 active proposals, with a limit of five per proposer. Large file bodies may be omitted from the review preview; editors can open a paged view of the full text. Canceled uploads can continue to count toward the limit until their upload links expire and cleanup finishes. Projects whose instructions come from a repository must make changes in that repository.
Only published versions are available through MCP and local sync. A pending proposal doesn't change the files your connected agents receive.
A connected agent finds them on its own. Every project fabric_get_project and
fabric_list_projects return carries a codingInstructions field — { "published": false }
when there is nothing to load, and the snapshot's version, fileCount, digest and
publishedAt when there is. The connection handshake tells the agent what to do with it:
call fabric_get_project_instruction_bundle to install the whole approved tree in one step,
or fabric_list_project_instructions and fabric_get_project_instruction to read individual
files, and follow them while working on that project. The field is omitted entirely for a key
that does not hold the instructions:read scope (or a coarse mcp:read/mcp:write).
Keeping an installed copy current does not always mean downloading it again. Pass the
digest you last installed as sinceDigest to either
fabric_get_project_instruction_bundle or fabric_list_project_instructions:
- the digest still matches — you get
"unchanged": trueand nothing else: no file list, no manifest, and no zip URL, so nothing is built or transferred. This is the only case that short-circuits; - it has moved on — you get the response you would have got anyway, in full, plus
changes(the added, removed and changed paths) andsince, the snapshot that digest names.sinceDigesttells you what changed; it does not send you a smaller download; - Fabric has never published that digest for this project, or has since pruned it — you get
"changes": nullalongside the same full response, which means treat it as a fresh install.
The Connect dialog also offers a starter sentence to paste into your tool. It is optional now that the project response advertises the instructions, and useful mainly to point an agent at one specific project:
Use the Fabric MCP server to load the published coding instructions for the project
"Your Project" and follow them while you help me work on it.Bootstrap a Project
A new project's Context tab is often empty, which leaves Fabric's AI features little to
work from. A connected coding agent can fill it from the repository you already have open: it sets the project's description, then pushes your README and key docs as
knowledge sources. The connection handshake tells the agent to offer this when a project's
fabric_list_project_contexts comes back with few or no sources.
The flow uses two tools. fabric_update_project sets the description, and
fabric_upsert_project_context pushes one file per call, keyed by the file's path in the
repository:
{ "name": "fabric_update_project",
"arguments": { "projectId": "proj_example", "description": "Billing service: invoicing, payment retries and dunning." } }
{ "name": "fabric_upsert_project_context",
"arguments": { "projectId": "proj_example", "sourcePath": "README.md", "content": "# Billing service\n..." } }
{ "name": "fabric_upsert_project_context",
"arguments": { "projectId": "proj_example", "sourcePath": "docs/architecture.md", "content": "# Architecture\n..." } }Pushed files appear in the project's Context tab under Living Memory, grouped by the folder of their path.
Pushing the same path again with the same content answers unchanged and writes nothing,
and content identical to a source already in the project — another pushed file, or a file,
link or note added in the Context tab — answers duplicate. To replace a
file that is already there, the agent passes the contentHash it read from
fabric_get_project_context or fabric_list_project_contexts as expectedContentHash; if
someone else has changed the file since, the push answers conflict with the current hash and
who changed it, and nothing is overwritten. If the file was deleted since, the push answers
conflict with current set to null; call again without expectedContentHash to recreate it,
which answers duplicate instead if that content already exists elsewhere in the project.
When a file was renamed or moved without changing, push it at its new path with the old path as
movedFromSourcePath and the old path's contentHash as expectedContentHash: the stored source
is renamed in place and answers moved, keeping its history, instead of leaving a second copy
behind.
Coding-instruction files — CLAUDE.md, AGENTS.md, anything under .claude/, and skills,
agents, hooks, rules and scripts — do not go through this flow. The agent proposes those with
fabric_propose_project_instruction_change, which opens a proposal on the Coding Instructions
tab for a person to review. The agent should also leave out secrets, .env files and
generated output.
Pushing context needs a key with the projects:write or mcp:write scope — the read-only key
that Connect your agent mints cannot do it — and, as with every key, your own permission to
add context sources to that project. If those docs already sit together in one folder, the
Fabric CLI can push the whole folder instead: fabric context push <dir> --project <id> sends
each text file by its path with the same unchanged, duplicate and conflict answers, and
remembers what it sent so that later runs send only what changed. It needs the same
projects:write scope. To start the agent flow, paste a sentence like this into your agent:
Use the Fabric MCP server to bootstrap the context for the project "Your Project" from this
repository: set its description and push the README and key docs, and tell me what you pushed.What Tools Are Available?
When your client connects, it receives two categories of tools:
Platform Tools (Always Available)
These give the AI direct access to your Fabric data — no extra setup needed:
| Tool | Description |
|---|---|
fabric_get_identity | See your user context, active organization, and available orgs |
fabric_list_organizations | List all organizations you belong to |
fabric_switch_organization | Switch between personal and org context |
fabric_list_projects | List your projects with filtering and search, each with its published codingInstructions |
fabric_get_project | Get full project details, including its published codingInstructions |
fabric_create_project | Create a new project |
fabric_update_project | Update project name or description |
fabric_list_documents | List documents in a project (PRDs, specs, etc.) |
fabric_get_document | Get full document content in markdown |
fabric_list_project_contexts | List a project's Context tab sources — uploads, meeting transcripts, crawled links, notes |
fabric_get_project_context | Read one context source in full: transcript text, extracted file text, or crawled markdown |
fabric_upsert_project_context | Push a text file into a project's Context by its relative path: unchanged content is skipped, changed content replaces the stored version and is re-indexed, and replacing a file requires the contentHash you last read so nobody's edit is silently overwritten |
fabric_list_project_instructions | Browse or search a project's published coding-instruction files, or ask what changed since a sinceDigest |
fabric_get_project_instruction | Read one published coding-instruction file by path, paged for large files |
fabric_get_project_instruction_bundle | Install the whole published tree as one zip, and report what changed since a sinceDigest |
fabric_list_workspaces | List your knowledge base workspaces |
fabric_get_workspace | Get workspace details and document list |
fabric_query_workspace | Semantic search (RAG) across workspace documents |
fabric_list_workflows | List your automation workflows |
fabric_get_workflow | Get workflow details including nodes and edges |
fabric_execute_workflow | Trigger a published workflow |
fabric_get_workflow_execution | Check workflow execution status |
fabric_list_chats | List recent AI conversations |
fabric_list_connected_servers | See all your connected MCP servers |
Connected Server Tools (Require Authority)
Every MCP server you've connected in Settings → MCP Servers becomes available, namespaced by server name:
linear__list_issues → List issues from your Linear connection
linear__create_issue → Create an issue in Linear
github__list_repos → List repos from your GitHub connection
slack__send_message → Send a message via your Slack connection
notion__search → Search your Notion workspace
fizzy__get_cards → Get cards from Fizzy boardsConnected server tools require runtime authority before use. See Runtime Authority for details.
Per-User Tool Visibility
Each user only sees tools from MCP servers they personally connected in their current context:
- User A connected Fizzy only → sees
fizzy__*tools - User B connected Linear + Fizzy → sees
linear__*+fizzy__*tools - In org context → sees tools from servers connected within that organization
- Personal connections never appear in org context, and vice versa
Runtime Authority
Connected server tools are protected by runtime authority — a Pipes-style session-scoped authorization model. This means:
- Credentials are persistent — your MCP server connections stay configured
- Runtime access is ephemeral — AI agents must request temporary permission before using tools
- Approval is human-only — agents can request authority, but only humans can approve it
The Authority Flow
Authority Tools
| Tool | Description |
|---|---|
fabric_request_authority | Request access to providers (e.g., linear, github) with READ or WRITE level and TTL |
fabric_check_authority | Check which providers are currently authorized |
fabric_revoke_authority | End all active authority immediately |
Authority Metadata in tools/list
Connected tools include metadata indicating their authority status:
{
"name": "linear__list_issues",
"description": "[Linear] List issues",
"_meta": {
"requiresAuthority": true,
"authorityStatus": "granted",
"providerKey": "linear"
}
}For more details, see Runtime Authority.
Example Conversations
Cross-Platform Project Sync
"Show me the features in the Acme project, then create a Linear issue for each one that doesn't have a corresponding ticket"
The AI will:
fabric_list_projects→ find Acmefabric_list_documents→ get feature docsfabric_request_authorityfor Linear (WRITE)- Wait for your approval in Fabric UI
linear__list_issues→ compare with featureslinear__create_issue→ create missing tickets
Research From Project Context
"Read the last two design meetings on the Acme project and tell me what we decided about rate limiting"
The AI will:
fabric_list_projects→ find Acmefabric_list_project_contextswithtype: "MEETING_TRANSCRIPT"→ list the synced transcriptsfabric_get_project_contexton the two most recent → read the transcript text- Answer from the transcripts, paging with
nextOffsetif a transcript is long
This is the same material the Context tab's Download All export covers. Two things to know before you rely on it:
- Repository code-index entries (
CODE_FILE,CODE_FILE_SUMMARY) are hidden from an unfiltered listing — an indexed repo produces thousands. PassincludeCodeContexts: trueor filter by that type to see them. - A context that pins a monitored Teams or Slack conversation carries no transcript of
its own: those messages are analysed into backlog proposals rather than stored on the
context. Such rows come back with
contentAvailable: falseand anunavailableReasonsaying so, rather than an empty body.
Knowledge Base Search
"Search the engineering workspace for our database migration strategy and summarize the key decisions"
The AI will:
fabric_list_workspaces→ find engineering workspacefabric_query_workspace→ semantic search for "database migration strategy"- Return a summary based on the matching document chunks
Workflow Execution
"Run the weekly report workflow and send the output to #team-updates on Slack"
The AI will:
fabric_list_workflows→ find weekly reportfabric_execute_workflow→ trigger itfabric_get_workflow_execution→ wait for completionfabric_request_authorityfor Slack (WRITE)slack__send_message→ post the results
Protocol Details
The gateway implements the MCP 2025-03-26 Streamable HTTP transport:
| Method | Endpoint | Purpose |
|---|---|---|
POST | /api/mcp-gateway | JSON-RPC requests (initialize, tools/list, tools/call) |
GET | /api/mcp-gateway | Server info (health check) |
DELETE | /api/mcp-gateway | Terminate session |
Session Management
- Sessions are created automatically on first request
- Session ID is returned in the
Mcp-Session-Idresponse header - Sessions last 24 hours
- Active authority sessions are completed when the gateway session ends
Authentication
| Method | Header | Use Case |
|---|---|---|
| API Key | Authorization: Bearer fab_xxx | External clients (recommended) |
| Session Cookie | Automatic | Browser-based clients |