Skip to content

Commit 3065413

Browse files
feat(docs): enhance MCP Mesh documentation and navigation (#2112)
- Added new documentation files for API Keys, Authentication, Authorization & Roles, Concepts, Connect Clients, MCP Gateways, MCP Servers, Monitoring, and Overview in both English and Portuguese. - Updated the introduction and quickstart sections to provide clearer guidance on using the MCP Mesh. - Improved the navigation order in the sidebar to prioritize MCP Mesh documentation. - Added a new screenshot for roles and permissions. - Updated GitHub repository links in the site configuration.
1 parent d92adc9 commit 3065413

30 files changed

Lines changed: 1239 additions & 64 deletions
381 KB
Loading

apps/docs/client/src/components/ui/Sidebar.astro

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,34 @@ function buildTree(docs: any[]): TreeNode[] {
6565
// Get parent folder to determine which order to use
6666
const parentPath = a.path[a.path.length - 2];
6767
68+
// Custom order for MCP Mesh top-level pages
69+
if (parentPath === "mcp-mesh") {
70+
// NOTE: doc IDs do not include ".mdx" (e.g. "overview", not "overview.mdx")
71+
const mcpMeshOrder = [
72+
"overview",
73+
"quickstart",
74+
"concepts",
75+
"connect-clients",
76+
"authentication",
77+
"authorization-and-roles",
78+
"mcp-servers",
79+
"mcp-gateways",
80+
"api-keys",
81+
"monitoring",
82+
"api-reference",
83+
];
84+
const aIndex = mcpMeshOrder.indexOf(a.name);
85+
const bIndex = mcpMeshOrder.indexOf(b.name);
86+
if (aIndex !== -1 && bIndex !== -1) {
87+
return aIndex - bIndex;
88+
}
89+
if (aIndex !== -1) return -1;
90+
if (bIndex !== -1) return 1;
91+
}
92+
6893
// Custom order for no-code-guides files
6994
if (parentPath === "no-code-guides") {
70-
const noCodeOrder = ["creating-tools.mdx", "creating-agents.mdx"];
95+
const noCodeOrder = ["creating-tools", "creating-agents"];
7196
const aIndex = noCodeOrder.indexOf(a.name);
7297
const bIndex = noCodeOrder.indexOf(b.name);
7398
if (aIndex !== -1 && bIndex !== -1) {
@@ -80,11 +105,11 @@ function buildTree(docs: any[]): TreeNode[] {
80105
// Custom order for full-code-guides files
81106
if (parentPath === "full-code-guides") {
82107
const fullCodeOrder = [
83-
"project-structure.mdx",
84-
"building-tools.mdx",
85-
"building-views.mdx",
86-
"resources.mdx",
87-
"deployment.mdx",
108+
"project-structure",
109+
"building-tools",
110+
"building-views",
111+
"resources",
112+
"deployment",
88113
];
89114
const aIndex = fullCodeOrder.indexOf(a.name);
90115
const bIndex = fullCodeOrder.indexOf(b.name);
@@ -98,10 +123,7 @@ function buildTree(docs: any[]): TreeNode[] {
98123
// Custom order for MCP Mesh deploy docs
99124
const rootPath = a.path[0];
100125
if (rootPath === "mcp-mesh" && parentPath === "deploy") {
101-
const deployOrder = [
102-
"local-docker-compose.mdx",
103-
"kubernetes-helm-chart.mdx",
104-
];
126+
const deployOrder = ["local-docker-compose", "kubernetes-helm-chart"];
105127
const aIndex = deployOrder.indexOf(a.name);
106128
const bIndex = deployOrder.indexOf(b.name);
107129
if (aIndex !== -1 && bIndex !== -1) {
@@ -115,11 +137,11 @@ function buildTree(docs: any[]): TreeNode[] {
115137
// For folders - custom ordering
116138
if (a.type === "folder" && b.type === "folder") {
117139
const folderOrder: Record<string, number> = {
118-
"getting-started": 0,
119-
"no-code-guides": 1,
120-
"full-code-guides": 2,
121-
// Keep new platform docs after the legacy guides (as per the original intent)
122-
"mcp-mesh": 3,
140+
// Put Mesh docs first
141+
"mcp-mesh": 0,
142+
"getting-started": 1,
143+
"no-code-guides": 2,
144+
"full-code-guides": 3,
123145
"mcp-studio": 4,
124146
};
125147
@@ -176,10 +198,15 @@ function groupLegacyAdminSections(nodes: TreeNode[]): TreeNode[] {
176198
}
177199
: null;
178200
179-
// Put MCP Mesh and MCP Studio at the top, then group legacy docs under Legacy Admin.
180-
const next: TreeNode[] = [...files];
201+
// Make "Introduction" the primary entry point, then product docs.
202+
const introduction = files.find((f) => f.name === "introduction");
203+
const otherFiles = files.filter((f) => f.name !== "introduction");
204+
205+
const next: TreeNode[] = [];
206+
if (introduction) next.push(introduction);
181207
if (mcpMesh) next.push(mcpMesh);
182208
if (mcpStudio) next.push(mcpStudio);
209+
next.push(...otherFiles);
183210
if (legacyFolder) next.push(legacyFolder);
184211
return next;
185212
}

apps/docs/client/src/components/ui/Sidebar.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,14 @@ function TreeList({
212212
const isNodeVisible = (node: FlatNode): boolean => {
213213
if (node.depth === 0) return true;
214214

215-
// Find the parent folder
216-
const parentPath = node.path.slice(0, -1);
217-
const parentId = parentPath.join("/");
215+
// A node is visible only if ALL its ancestor folders are expanded.
216+
// (This fixes cases where a grandparent folder is collapsed but a child still shows.)
217+
for (let i = 1; i < node.path.length; i++) {
218+
const ancestorId = node.path.slice(0, i).join("/");
219+
if (treeState.get(ancestorId) === false) return false;
220+
}
218221

219-
return treeState.get(parentId) !== false;
222+
return true;
220223
};
221224

222225
// Group nodes to determine when to add separators

apps/docs/client/src/config/site.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ export const siteConfig = {
44
url: "https://your-domain.com",
55
ogImage: "https://your-domain.com/og.jpg",
66
links: {
7-
github: "https://github.com/deco-cx/chat",
7+
github: "https://github.com/decocms/mesh",
88
},
99
// GitHub repository URL for edit links
10-
githubRepo: "https://github.com/deco-cx/chat",
10+
githubRepo: "https://github.com/decocms/mesh",
1111
// GitHub branch name (usually 'main' or 'master')
1212
githubBranch: "main",
1313
} as const;

apps/docs/client/src/content/en/introduction.mdx

Lines changed: 70 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Callout from "../../components/ui/Callout.astro";
1212

1313
**deco CMS** is an open-source **Context Management System** for AI-native operations.
1414

15-
If MCP is the standard interface for tool access, deco CMS is the **production layer around it**: connect MCP servers, enforce governance, and get observability as usage scales across teams and environments. The broader platform also includes a **builder framework** (MCP Studio — coming soon, replacing the legacy admin) and **distribution capabilities** (pre-built modules and store).
15+
If MCP is the standard interface for tool access, deco CMS is the **production layer around it**: connect MCP servers, enforce governance, and get observability as usage scales across teams and environments. The broader platform also includes a **builder framework** (MCP Studio — coming soon) and **distribution capabilities** (pre-built modules and store).
1616

1717
**Official links:**
1818

@@ -22,15 +22,37 @@ If MCP is the standard interface for tool access, deco CMS is the **production l
2222

2323
If you know us from before (as **deco.cx**) and you’re looking for **headless CMS + storefront** capabilities, visit [deco.cx](https://www.decocms.com/use-case/deco-cx). See the deco.cx docs at [docs.deco.cx](https://docs.deco.cx/en/getting-started/overview).
2424

25-
## Quick start (Mesh)
25+
## Start with the MCP Mesh
2626

27-
### Option A: one-command local Mesh setup
27+
Choose one:
28+
29+
### Option A: one-command local setup (npx)
2830

2931
```bash
3032
npx @decocms/mesh
3133
```
3234

33-
### Option B: run from source
35+
### Option B: local setup with Docker Compose
36+
37+
```bash
38+
# 1. Configure environment variables
39+
# Edit .env and configure BETTER_AUTH_SECRET (required)
40+
# Generate a secret: openssl rand -base64 32
41+
cp conf-examples/env.example .env
42+
43+
# 2. Configure authentication
44+
cp conf-examples/auth-config.json.example auth-config.json
45+
46+
# 3. Start the application
47+
docker compose up -d
48+
49+
# 4. Access
50+
open http://localhost:3000
51+
```
52+
53+
**More details:** [Local: Docker Compose](/en/mcp-mesh/deploy/local-docker-compose)
54+
55+
### Option C: run from source
3456

3557
```bash
3658
git clone https://github.com/decocms/mesh.git
@@ -39,32 +61,64 @@ bun install
3961
bun run dev
4062
```
4163

42-
## Deploy (Mesh)
64+
### Option D: deploy to Kubernetes (Helm)
65+
66+
```bash
67+
# 1. Generate a secure secret for authentication
68+
SECRET=$(openssl rand -base64 32)
69+
70+
# 2. Install the chart with the generated secret
71+
helm install deco-mcp-mesh . \
72+
--namespace deco-mcp-mesh \
73+
--create-namespace \
74+
--set secret.BETTER_AUTH_SECRET="$SECRET"
75+
76+
# 3. Wait for pods to be ready
77+
kubectl wait --for=condition=ready pod \
78+
-l app.kubernetes.io/instance=deco-mcp-mesh \
79+
-n deco-mcp-mesh \
80+
--timeout=300s
81+
82+
# 4. Access via port-forward
83+
kubectl port-forward svc/deco-mcp-mesh 8080:80 -n deco-mcp-mesh
84+
```
85+
86+
The application will be available at `http://localhost:8080`.
87+
88+
**More details:** [Kubernetes: Helm Chart](/en/mcp-mesh/deploy/kubernetes-helm-chart)
4389

44-
- **[Local: Docker Compose](/en/mcp-mesh/deploy/local-docker-compose)**
45-
- **[Kubernetes: Helm Chart](/en/mcp-mesh/deploy/kubernetes-helm-chart)**
90+
## Learn the Mesh (concepts + product surfaces)
91+
92+
- **[MCP Mesh Overview](/en/mcp-mesh/overview)**
93+
- **[Quickstart](/en/mcp-mesh/quickstart)**
94+
- **[Concepts](/en/mcp-mesh/concepts)**
95+
- **[MCP Servers (Connections)](/en/mcp-mesh/mcp-servers)**
96+
- **[MCP Gateways](/en/mcp-mesh/mcp-gateways)**
97+
- **[API Keys](/en/mcp-mesh/api-keys)**
98+
- **[Monitoring](/en/mcp-mesh/monitoring)**
4699

47100
<Callout type="warning">
48101
**Docs split (quick guide):**
49102

50103
- **The MCP Mesh** → Self-hosting, deploying, and operating the Mesh (recommended).
51104
- **Legacy Admin** → If you’re using `admin.decocms.com` (still supported, **deprecated soon**).
52105

53-
We’re launching **MCP Studio** (on top of Mesh), which will bring the current SaaS admin capabilities to the Mesh (including a hosted option by us) and replace the legacy SaaS over time.
106+
We’re launching **MCP Studio** (on top of the Mesh), which will bring the current SaaS admin capabilities to the Mesh (including a hosted option by us) and replace the legacy SaaS over time.
54107
</Callout>
55108

56-
## Problem (and what the Mesh fixes)
109+
## Problem: the production gap
110+
111+
AI is easy to demo and hard to **operate**.
57112

58-
When AI moves from demos to production, teams usually hit the same constraints:
113+
As tool surfaces and teams grow, most orgs run into the same production constraints:
59114

60-
- **Governance gaps**: no single place to enforce SSO/RBAC, approvals, and audit trails
61-
- **Integration sprawl**: every client wires every tool with its own retries, auth, and config
62-
- **Operational blind spots**: debugging is slow; failures and costs are hard to trace end-to-end
63-
- **Context obesity**: bloated prompts and tool lists degrade quality and increase cost
115+
- **Autonomy breaks**: shipping gets bottlenecked by bespoke integrations, security reviews, and platform tickets
116+
- **Context fragments**: knowledge lives across many systems and teams rebuild connectors and retrieval repeatedly
117+
- **Governance is inconsistent**: no single place for SSO/RBAC, audit trails, and operational visibility
64118

65-
The MCP Mesh centralizes those cross-cutting concerns **once** so you don’t rebuild them in every agent/app.
119+
For more context on our platform-level thesis, read [The architecture of an AI-native company](https://www.decocms.com/blog/post/ai-native-company).
66120

67-
## Platform structure: Mesh → Studio → Distribution
121+
## Platform structure: Mesh → Studio → Apps & Store
68122

69123
### The MCP Mesh (foundation)
70124
An open-source **control plane for MCP traffic**. It sits between your MCP clients (Cursor, Claude, VS Code, custom agents) and your MCP servers, providing a unified layer for auth, policy, and observability.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
title: API Keys
3+
description: Create scoped API keys to access management tools, proxies, and gateways
4+
icon: KeyRound
5+
---
6+
7+
import Callout from "../../../components/ui/Callout.astro";
8+
9+
## What are API keys for?
10+
11+
API keys are the simplest way to give an agent/app access to the Mesh without an interactive login flow. Keys are:
12+
13+
- **scoped** (explicit permissions)
14+
- **revocable**
15+
- **auditable** (calls show up in Monitoring)
16+
17+
## Best practices
18+
19+
- **Least privilege**: only grant the tool permissions you need.
20+
- **Separate keys per workload**: one key per app/agent is easier to rotate.
21+
- **Use gateways for surface control**: combine API-key permissions with a curated gateway.
22+
23+
<Callout type="warning">
24+
Treat API keys like production secrets. Store them in a secrets manager and rotate regularly.
25+
</Callout>
26+
27+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
title: API Reference
3+
description: The core HTTP endpoints exposed by the Mesh for MCP, gateways, OAuth, and ops
4+
icon: Code
5+
---
6+
7+
## MCP endpoints
8+
9+
### Management MCP
10+
11+
- `POST /mcp`
12+
13+
This endpoint exposes **management tools** via MCP (orgs, connections, gateways, API keys, monitoring, event bus).
14+
15+
### Connection proxy
16+
17+
- `POST /mcp/:connectionId`
18+
19+
Proxies MCP requests to a single upstream connection.
20+
21+
### Gateway (virtual server)
22+
23+
- `POST /mcp/gateway/:gatewayId`
24+
- `POST /mcp/gateway` (default gateway; requires `x-org-id` or `x-org-slug`)
25+
26+
Aggregates tools/resources/prompts across multiple connections.
27+
28+
## OAuth discovery
29+
30+
- `GET /.well-known/oauth-protected-resource`
31+
- `GET /.well-known/oauth-authorization-server`
32+
33+
## Ops
34+
35+
- `GET /health`
36+
- `GET /metrics`
37+
38+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
title: Authentication
3+
description: Supported auth methods and how to configure them for self-hosting
4+
icon: ShieldCheck
5+
---
6+
7+
import Callout from "../../../components/ui/Callout.astro";
8+
9+
## What’s supported
10+
11+
The Mesh uses Better Auth and supports:
12+
13+
- **Email/password**
14+
- **Magic link**
15+
- **Social providers** (e.g. Google, GitHub)
16+
- **SAML SSO** (for enterprise orgs)
17+
18+
## Configure auth (self-hosting)
19+
20+
Self-hosted deployments load an `auth-config.json` file at startup (see your deployment guides for mounting details).
21+
22+
<Callout type="warning">
23+
Keep provider secrets out of Git. In production, use Secrets management (Kubernetes Secrets, External Secrets Operator, etc.).
24+
</Callout>
25+
26+
## Key environment variables
27+
28+
- `BETTER_AUTH_SECRET` (required)
29+
- `BETTER_AUTH_URL` / `BASE_URL` (recommended to set explicitly in production)
30+
31+

0 commit comments

Comments
 (0)