Skip to content

Commit 3c0774a

Browse files
committed
docs: expand administrator docs — Setup console, users & org, access management
New Configure pages: Administration landing (Setup console tour and task map), Users & Organization (business units, invitations, teams, service accounts), Managing Access (onboarding/offboarding recipes), Field-Level Security, and Connect AI tools via MCP. Sidebar metas updated across all locales. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0145MY7RdJr8KuRMyn5oKAR6
1 parent 56f8f2f commit 3c0774a

19 files changed

Lines changed: 781 additions & 94 deletions

content/docs/configure/index.mdx

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
---
2+
title: Administration
3+
description: Where system administrators manage users, access, settings, and integrations — and which page answers which task.
4+
---
5+
6+
# Administration
7+
8+
This section is for the **system administrator** of an ObjectOS
9+
deployment: the person who onboards users, grants access, wires up
10+
sign-in, email, storage, and integrations, and keeps the system healthy.
11+
You manage people and their permissions day to day; the applications,
12+
objects, and permission sets themselves ship with the platform and the
13+
app packages you install.
14+
15+
> **Permissions are designed in Studio, assigned in Setup.** Most
16+
> administration never leaves Setup — you enter Studio only to author
17+
> permission sets or to run the explain engine.
18+
19+
## The Setup console
20+
21+
The built-in administration console lives at **`/apps/setup`** and
22+
requires the `setup.access` permission. Its left-hand navigation is
23+
contributed at runtime by the capability plugins that are loaded, so the
24+
menu you see reflects exactly what your deployment runs — a disabled
25+
capability contributes nothing and its group stays empty.
26+
27+
The stable navigation groups:
28+
29+
| Group | What you find there |
30+
|---|---|
31+
| **Overview** | System Overview dashboard |
32+
| **People & Organization** | Users, Business Units, Teams, Organizations, Invitations |
33+
| **Access Control** | Positions, Permission Sets, Sharing Rules, Record Shares, API Keys |
34+
| **Approvals** | Approval processes (when the approvals plugin is loaded) |
35+
| **Configuration** | All Settings, Branding, Authentication, Email, File Storage, AI & Embedder, Knowledge, Feature Flags |
36+
| **Diagnostics** | Sessions, Notification Events, Audit Logs |
37+
| **Integrations** | Webhooks |
38+
| **Advanced** | OAuth Applications, Signing Keys (JWKS), Identity Links, User Preferences |
39+
40+
## Task map
41+
42+
| I need to… | Read |
43+
|---|---|
44+
| Add users, build the org tree, manage teams | [Users & Organization](/docs/configure/users) |
45+
| Onboard, offboard, or change someone's access | [Managing Access](/docs/configure/permissions/managing-access) |
46+
| Understand the whole access model | [Permissions](/docs/configure/permissions) |
47+
| Configure sign-in, OAuth, SSO, 2FA | [Authentication](/docs/configure/authentication) |
48+
| Change runtime and tenant settings | [System Settings](/docs/configure/system-settings) |
49+
| Set up transactional email delivery | [Email](/docs/configure/email) |
50+
| Configure file storage (S3, local disk) | [Storage](/docs/configure/storage) |
51+
| Connect external business databases | [Data Sources](/docs/configure/data-sources) |
52+
| Use the REST API and API keys | [API Access](/docs/configure/api-access) |
53+
| Deliver outbound webhooks | [Webhooks](/docs/configure/webhooks) |
54+
| Configure AI providers, embedders, RAG | [AI Service](/docs/configure/ai) |
55+
| Connect Claude or another MCP client | [Connect AI Tools (MCP)](/docs/configure/mcp) |
56+
| Configure artifact loading, database, cache | [Runtime Configuration](/docs/configure/runtime) |
57+
| Plan backups and disaster recovery | [Backup](/docs/operate/backup) |
58+
| Upgrade or roll back safely | [Upgrade](/docs/operate/upgrade) |
59+
| Harden for production | [Production Readiness](/docs/operate/production) |
60+
| Read logs, metrics, and audit trails | [Observability](/docs/operate/observability) |
61+
| Diagnose a broken deployment | [Troubleshooting](/docs/operate/troubleshooting) |
62+
63+
## Where to go next
64+
65+
| Task | Page |
66+
|---|---|
67+
| Your first admin task: add people and structure | [Users & Organization](/docs/configure/users) |
68+
| Give a new hire access | [Managing Access](/docs/configure/permissions/managing-access) |
69+
| Learn the layered access model | [Permissions](/docs/configure/permissions) |
70+
| Pre-production checklist | [Production Readiness](/docs/operate/production) |

content/docs/configure/mcp.mdx

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
---
2+
title: Connect AI Tools (MCP)
3+
description: Point Claude Code, Claude Desktop, or any MCP client at your ObjectOS app and let agents work with your data under your permission model.
4+
---
5+
6+
# Connect AI Tools (MCP)
7+
8+
Every ObjectOS deployment is already an MCP server. The runtime serves
9+
the [Model Context Protocol](https://modelcontextprotocol.io) at
10+
**`/api/v1/mcp`** — on by default, no plugin to install, no
11+
configuration step. Your objects and exposed actions become typed tools
12+
the moment you define them; the only thing left to do is connect a
13+
client and prove it works.
14+
15+
> To turn the surface off, set `OS_MCP_SERVER_ENABLED=false` — the
16+
> endpoint then returns 404 and the **Setup → Connect an Agent** page
17+
> disappears with it.
18+
19+
This page is about connecting *external* AI tools to your app. For the
20+
server-side AI stack — chat providers, embedders, RAG, and registering
21+
the MCP server plugin explicitly in code — see
22+
[AI Service](/docs/configure/ai).
23+
24+
## Claude Code (one command)
25+
26+
Interactive clients use OAuth — each deployment is its own OAuth 2.1
27+
authorization server, so there are no admin-minted credentials to pass
28+
around. The first tool call opens a browser login and you connect **as
29+
yourself**:
30+
31+
```bash
32+
# local dev server
33+
claude mcp add --transport http my-app http://localhost:3000/api/v1/mcp
34+
35+
# a deployed instance
36+
claude mcp add --transport http my-app https://your-deployment.example.com/api/v1/mcp
37+
```
38+
39+
For headless use (CI, containers) skip OAuth and attach an
40+
[API key](#headless-api-keys) instead:
41+
42+
```bash
43+
claude mcp add --transport http my-app https://your-deployment.example.com/api/v1/mcp \
44+
--header "x-api-key: osk_..."
45+
```
46+
47+
## Claude Desktop and claude.ai
48+
49+
**Settings → Connectors → Add custom connector**, then paste the MCP
50+
URL (`https://your-deployment.example.com/api/v1/mcp`). The first use
51+
walks through the same browser login.
52+
53+
## Any MCP client (`.mcp.json`)
54+
55+
Clients that read an `mcpServers` map connect the same way. With an API
56+
key:
57+
58+
```json
59+
{
60+
"mcpServers": {
61+
"objectstack": {
62+
"type": "http",
63+
"url": "https://your-deployment.example.com/api/v1/mcp",
64+
"headers": { "x-api-key": "osk_..." }
65+
}
66+
}
67+
}
68+
```
69+
70+
## Headless: API keys
71+
72+
Mint a key from **Setup → Connect an Agent** (which also shows
73+
copy-paste-ready connect snippets per client), or over REST:
74+
75+
```bash
76+
curl -b cookies.txt -X POST https://your-deployment.example.com/api/v1/keys
77+
# → { "key": "osk_..." } — shown once; store it in your secret manager
78+
```
79+
80+
Send it on every request in any of three equivalent forms:
81+
82+
| Header | Example |
83+
|---|---|
84+
| `x-api-key` | `x-api-key: osk_...` |
85+
| `Authorization: ApiKey` | `Authorization: ApiKey osk_...` |
86+
| `Authorization: Bearer` | `Authorization: Bearer osk_...` (recognized by the `osk_` prefix) |
87+
88+
> OAuth requires TLS — plain-HTTP deployments (except `localhost`) fall
89+
> back to **API-key-only**: the browser-login track is disabled rather
90+
> than allowed to run insecurely.
91+
92+
For a long-lived integration, bind the key to a dedicated service user
93+
with a minimal permission set — see
94+
[Service accounts & API keys](/docs/configure/users#service-accounts--api-keys).
95+
96+
## What the agent gets
97+
98+
Ten data and action tools, generated from your metadata:
99+
100+
| Tool | What it does |
101+
|---|---|
102+
| `list_objects` / `describe_object` | Discover which objects exist and their fields |
103+
| `query_records` / `get_record` | Read data (list queries are capped at 50 rows per page by default) |
104+
| `aggregate_records` | Grouped aggregation (registered when the active driver supports it) |
105+
| `create_record` / `update_record` / `delete_record` | Write data |
106+
| `list_actions` / `run_action` | Discover and invoke your business actions by name |
107+
108+
Two exposure rules to know:
109+
110+
- **Objects are exposed automatically** — except `sys_*` system
111+
objects, which are blocked fail-closed.
112+
- **Actions require the author's opt-in**: `ai: { exposed: true }` plus
113+
an `ai.description` of at least 40 characters, and the action must be
114+
callable without a UI (`script` with a body or registered handler, or
115+
`flow`).
116+
117+
## Permission enforcement
118+
119+
- **Every call runs as the caller.** The MCP bridge resolves the same
120+
execution context as a REST request, so object permissions,
121+
[record access](/docs/configure/permissions/record-access), and
122+
[field-level security](/docs/configure/permissions/field-level-security)
123+
apply to the agent exactly as they do to a person in the UI. Sparse
124+
results or denied writes usually mean governance is *working*, not
125+
that the connection is broken.
126+
- **OAuth scopes narrow the toolset.** Tokens carry `data:read`,
127+
`data:write`, and `actions:execute` scopes — tools outside the
128+
granted scopes are not even registered for that session. API-key and
129+
session callers get the full set, still permission-checked per call.
130+
- **Action bodies run as trusted app code** once invoked (the
131+
`ai.exposed` gate and `requiredPermissions` are checked at *invoke*
132+
time). Treat writing an action as a code-review-worthy act — that's
133+
the real security boundary.
134+
- An action can also declare `ai.requiresConfirmation`;
135+
destructive-looking actions default to requiring it.
136+
137+
## Verify the connection
138+
139+
Ask the agent something only the live schema can answer:
140+
141+
```text
142+
What objects does this app have, and what fields does the main one carry?
143+
```
144+
145+
You should see `list_objects` and `describe_object` fire. The natural
146+
working pattern for an agent is `list_objects``describe_object`
147+
`query_records``run_action` — if all four work, the connection is
148+
fully operational.
149+
150+
> Agents work noticeably better with the app's **skill file**: download
151+
> it from `GET /api/v1/mcp/skill`, or install the
152+
> [official Claude plugin](https://github.com/objectstack-ai/claude-plugin)
153+
> (`claude plugin marketplace add objectstack-ai/claude-plugin`), which
154+
> bundles the skill and a guided `/objectstack:connect` command.
155+
156+
## Troubleshooting
157+
158+
| Symptom | Cause → fix |
159+
|---|---|
160+
| `404` on `/api/v1/mcp` | The surface is disabled — unset `OS_MCP_SERVER_ENABLED` (default is on) |
161+
| `501 Not Implemented` | The MCP plugin isn't part of this build — check your stack's plugins |
162+
| `401` on every call | Anonymous or invalid credentials. Interactive clients: complete the browser login. Headless: check the `osk_` key and header spelling |
163+
| `403 insufficient_scope` | The OAuth token lacks the scope for that tool family (e.g. writes without `data:write`) — reconnect and grant the scope |
164+
| An action is missing from `list_actions` | `ai.exposed` is not `true`, `ai.description` is shorter than 40 characters, the type isn't headless-callable (`url` / `modal` / `form` never appear), it targets a `sys_*` object, or the caller fails its `requiredPermissions` |
165+
| Reads return few rows / writes denied | Working as designed — the caller's permissions and record access apply. Verify with the same user in the UI |
166+
167+
## Where to go next
168+
169+
| Task | Page |
170+
|---|---|
171+
| Configure AI providers, embedders, and the MCP server plugin | [AI Service](/docs/configure/ai) |
172+
| Create service users and API keys | [Users & Organization](/docs/configure/users) |
173+
| Understand what the agent is allowed to see | [Permissions](/docs/configure/permissions) |
174+
| REST API and key management | [API Access](/docs/configure/api-access) |
175+
| Verify a specific user's access | [Managing Access](/docs/configure/permissions/managing-access) |
Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
{
22
"title": "Konfigurieren",
33
"defaultOpen": false,
4-
"pages": [
5-
"runtime",
6-
"data-sources",
7-
"authentication",
8-
"permissions",
9-
"storage",
10-
"ai",
11-
"system-settings",
12-
"api-access",
13-
"webhooks",
14-
"email"
15-
]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
165
}
Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
{
22
"title": "Configurar",
33
"defaultOpen": false,
4-
"pages": [
5-
"runtime",
6-
"data-sources",
7-
"authentication",
8-
"permissions",
9-
"storage",
10-
"ai",
11-
"system-settings",
12-
"api-access",
13-
"webhooks",
14-
"email"
15-
]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
165
}
Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
{
22
"title": "Configurer",
33
"defaultOpen": false,
4-
"pages": [
5-
"runtime",
6-
"data-sources",
7-
"authentication",
8-
"permissions",
9-
"storage",
10-
"ai",
11-
"system-settings",
12-
"api-access",
13-
"webhooks",
14-
"email"
15-
]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
165
}
Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
{
22
"title": "設定",
33
"defaultOpen": false,
4-
"pages": [
5-
"runtime",
6-
"data-sources",
7-
"authentication",
8-
"permissions",
9-
"storage",
10-
"ai",
11-
"system-settings",
12-
"api-access",
13-
"webhooks",
14-
"email"
15-
]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
165
}

content/docs/configure/meta.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "Configure",
33
"defaultOpen": false,
4-
"pages": ["runtime", "data-sources", "authentication", "permissions", "storage", "ai", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
55
}
Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
{
22
"title": "설정",
33
"defaultOpen": false,
4-
"pages": [
5-
"runtime",
6-
"data-sources",
7-
"authentication",
8-
"permissions",
9-
"storage",
10-
"ai",
11-
"system-settings",
12-
"api-access",
13-
"webhooks",
14-
"email"
15-
]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
165
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "配置",
33
"defaultOpen": false,
4-
"pages": ["runtime", "data-sources", "authentication", "permissions", "storage", "ai", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
55
}

0 commit comments

Comments
 (0)