@henrikogard/auroradocs-mcp 0.1.1 → 0.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 CHANGED
@@ -1,14 +1,15 @@
1
1
  # AuroraDocs MCP Server
2
2
 
3
- `@henrikogard/auroradocs-mcp` connects a local MCP client to one AuroraCloud
4
- workspace. It runs on your computer over stdio and sends authenticated requests
5
- to `https://api.auroradocs.eu`.
3
+ `@henrikogard/auroradocs-mcp` connects a local MCP client to independently
4
+ granted AuroraCloud workspaces. It runs on your computer over stdio and sends
5
+ authenticated requests to `https://api.auroradocs.eu`.
6
6
 
7
7
  The public package is `@henrikogard/auroradocs-mcp`, the executable is
8
- `aurora-mcp`, and this documentation targets version `0.1.1`.
8
+ `aurora-mcp`, and this documentation targets version `0.2.0`.
9
9
 
10
10
  For an end-to-end installation walkthrough, use the dedicated
11
- [Setup guide](docs/setup.md).
11
+ [Setup guide](docs/setup.md). Hermes and OpenClaw users should also apply the
12
+ bounded [read-only agent profiles](docs/agent-profiles.md).
12
13
 
13
14
  ## Requirements
14
15
 
@@ -21,7 +22,14 @@ For an end-to-end installation walkthrough, use the dedicated
21
22
  Browser-only workspaces and Local folders workspaces are not supported. The
22
23
  server does not read a browser tab or a folder on your computer.
23
24
 
24
- ## Create an MCP key
25
+ ## Create an MCP credential
26
+
27
+ New multi-workspace installations should use an `aur_mcp_client_` credential
28
+ with owner-approved, independently revocable workspace grants. Follow the
29
+ [Setup guide](docs/setup.md) for that flow. The workspace-scoped `aur_mcp_`
30
+ steps below remain available during the legacy migration window.
31
+
32
+ ### Legacy workspace token
25
33
 
26
34
  1. Sign in to AuroraDocs and open the AuroraCloud workspace you want to use.
27
35
  2. Go to **Settings → Workspace → MCP Access**.
@@ -52,8 +60,8 @@ write scope does not imply its read counterpart.
52
60
  | Confirm the connection and list titles | `read:objects` |
53
61
  | Read page or Canvas content | `read:objects`, `read:content` |
54
62
  | Search and read workspace knowledge | `read:objects`, `read:content`, `search` |
55
- | Review or update tasks and week planning | `read:objects`, `tasks` |
56
- | Update task metadata after confirmation | `read:objects`, `tasks`, `write:objects` |
63
+ | Review tasks and week planning | `read:objects`, `read:tasks` |
64
+ | Update task metadata after confirmation | `read:objects`, `read:tasks`, `write:tasks`, `write:objects` |
57
65
  | Create or rename non-task objects | `read:objects`, `write:objects` |
58
66
  | Replace or append document content | `read:objects`, `read:content`, `write:content` |
59
67
 
@@ -62,8 +70,9 @@ membership at startup and most tools operate on object metadata. Add
62
70
  `write:objects` or `write:content` only when you intend to let the client modify
63
71
  the workspace. See the complete [scope and tool reference](docs/tools.md).
64
72
 
65
- The `tasks` scope permits both reading and writing task metadata. Do not grant
66
- it to a client that should have strictly read-only access.
73
+ New client grants use separate `read:tasks` and `write:tasks` scopes. The legacy
74
+ `tasks` scope permits both reading and writing task metadata; it is
75
+ compatibility-only and cannot be selected for new grants.
67
76
 
68
77
  `search_objects` and its `search` alias search object titles with `read:objects` only.
69
78
  `wiki_search` searches workspace knowledge and requires `read:objects` plus `search`.
@@ -72,18 +81,22 @@ in the knowledge-search recipe above.
72
81
 
73
82
  ## Configure a client
74
83
 
75
- All examples below use the production AuroraCloud API and pin package version
76
- `0.1.1`. Replace `WORKSPACE_ID` and `REDACTED` locally. Do not commit the
84
+ All examples below use the production AuroraCloud API, a new client credential,
85
+ and package version `0.2.0`. Replace `REDACTED` locally. Do not commit the
77
86
  resulting configuration. The examples store the token in the client's saved
78
87
  configuration, so protect that file as a credential.
79
88
 
80
- The server requires exactly these environment variables:
89
+ New client credentials require these environment variables:
81
90
 
82
91
  | Variable | Value |
83
92
  | --- | --- |
84
93
  | `AURORA_API_URL` | `https://api.auroradocs.eu` |
85
- | `AURORA_WORKSPACE_ID` | the workspace ID shown on the MCP Access page |
86
- | `AURORA_API_TOKEN` | the one-time `aur_mcp_` token |
94
+ | `AURORA_API_TOKEN` | the one-time `aur_mcp_client_` credential |
95
+
96
+ Do not set `AURORA_WORKSPACE_ID` for a client credential. The server discovers
97
+ only its owner-approved grants with `list_workspaces`; each data call then
98
+ selects a workspace explicitly. A legacy `aur_mcp_` token still requires
99
+ `AURORA_WORKSPACE_ID` during the migration window.
87
100
 
88
101
  Do not configure an AuroraDocs email or password. Public onboarding supports
89
102
  MCP-token authentication only.
@@ -98,10 +111,9 @@ this server under `mcpServers`, preserving any servers already present:
98
111
  "mcpServers": {
99
112
  "auroradocs": {
100
113
  "command": "npx",
101
- "args": ["-y", "@henrikogard/auroradocs-mcp@0.1.1"],
114
+ "args": ["-y", "@henrikogard/auroradocs-mcp@0.2.0"],
102
115
  "env": {
103
116
  "AURORA_API_URL": "https://api.auroradocs.eu",
104
- "AURORA_WORKSPACE_ID": "WORKSPACE_ID",
105
117
  "AURORA_API_TOKEN": "REDACTED"
106
118
  }
107
119
  }
@@ -121,9 +133,8 @@ Options must appear before the server name:
121
133
  ```bash
122
134
  claude mcp add --transport stdio --scope user \
123
135
  --env AURORA_API_URL=https://api.auroradocs.eu \
124
- --env AURORA_WORKSPACE_ID=WORKSPACE_ID \
125
136
  --env AURORA_API_TOKEN=REDACTED \
126
- auroradocs -- npx -y @henrikogard/auroradocs-mcp@0.1.1
137
+ auroradocs -- npx -y @henrikogard/auroradocs-mcp@0.2.0
127
138
  ```
128
139
 
129
140
  Run `claude mcp get auroradocs` to inspect the saved entry, then use `/mcp` in
@@ -137,9 +148,8 @@ The installed Codex CLI accepts `--env` for local stdio servers:
137
148
  ```bash
138
149
  codex mcp add \
139
150
  --env AURORA_API_URL=https://api.auroradocs.eu \
140
- --env AURORA_WORKSPACE_ID=WORKSPACE_ID \
141
151
  --env AURORA_API_TOKEN=REDACTED \
142
- auroradocs -- npx -y @henrikogard/auroradocs-mcp@0.1.1
152
+ auroradocs -- npx -y @henrikogard/auroradocs-mcp@0.2.0
143
153
  ```
144
154
 
145
155
  Run `codex mcp get auroradocs` to inspect the saved entry.
@@ -151,10 +161,9 @@ Use this valid generic JSON shape when a client accepts an MCP server object:
151
161
  ```json
152
162
  {
153
163
  "command": "npx",
154
- "args": ["-y", "@henrikogard/auroradocs-mcp@0.1.1"],
164
+ "args": ["-y", "@henrikogard/auroradocs-mcp@0.2.0"],
155
165
  "env": {
156
166
  "AURORA_API_URL": "https://api.auroradocs.eu",
157
- "AURORA_WORKSPACE_ID": "WORKSPACE_ID",
158
167
  "AURORA_API_TOKEN": "REDACTED"
159
168
  }
160
169
  }
@@ -166,13 +175,13 @@ local server calls, not a hosted MCP endpoint.
166
175
 
167
176
  ## Verify read-only access first
168
177
 
169
- 1. Mint a token with only `read:objects`.
178
+ 1. Grant the client one workspace with only `read:objects`.
170
179
  2. Start or restart the client.
171
- 3. Ask the client to call `list_objects` with a small limit and return only
172
- object titles and IDs.
173
- 4. Confirm that the result belongs to the intended workspace.
174
- 5. Only then mint a replacement token with any additional scopes your workflow
175
- genuinely needs. Update the client, verify it, and revoke the first token.
180
+ 3. Ask the client to call `list_workspaces` and confirm only the expected grant
181
+ is visible.
182
+ 4. Call `get_project_context` for one explicit workspace and project ID.
183
+ 5. Only then extend that workspace grant with any optional read scopes the
184
+ workflow genuinely needs.
176
185
 
177
186
  If the connection fails, see [Troubleshooting](docs/troubleshooting.md). Never
178
187
  paste the raw token into logs or bug reports.
@@ -212,6 +221,8 @@ report a vulnerability, follow [SECURITY.md](SECURITY.md).
212
221
  ## Reference
213
222
 
214
223
  - [Tools and scopes](docs/tools.md)
224
+ - [Hermes and OpenClaw agent profiles](docs/agent-profiles.md)
225
+ - [Agent planning and knowledge roadmap](docs/agent-planning-knowledge-roadmap.md)
215
226
  - [Security boundaries](docs/security.md)
216
227
  - [Troubleshooting](docs/troubleshooting.md)
217
228
  - [Contributing](CONTRIBUTING.md)
@@ -226,13 +237,19 @@ pnpm check
226
237
  ```
227
238
 
228
239
  The live AuroraCloud smoke test is intentionally separate because it requires a
229
- real workspace and a least-privilege `aur_mcp_` token. Give the smoke token only
230
- `read:objects`, `read:content`, and `search`; explicitly omit `tasks` because
231
- that scope authorizes both task reads and task writes. The smoke authenticates,
232
- checks membership, lists tools, members, and objects, and reads the recent
233
- knowledge catalog. Every dispatched tool must carry the catalog's authoritative
234
- read-only classification, and the smoke never creates, updates, or deletes
235
- workspace data. See [CONTRIBUTING.md](CONTRIBUTING.md) before using it.
240
+ real owner-approved workspace grant. Prefer `AURORA_API_TOKEN=aur_mcp_client_...`
241
+ with `AURORA_API_URL`; a legacy `aur_mcp_...` token additionally requires
242
+ `AURORA_WORKSPACE_ID`. Grant only `read:objects`; add `read:content` only when
243
+ the selected project's readable brief or citations must be included.
244
+
245
+ The smoke always calls `list_workspaces`. Set `AURORA_SMOKE_PROJECT_ID` to add
246
+ one bounded `get_project_context` request; omit it to verify discovery without
247
+ guessing a project. When a client credential has multiple grants, also set
248
+ `AURORA_SMOKE_WORKSPACE_ID` for that project check. The dispatcher verifies the
249
+ catalog's authoritative read-only classification and never dispatches a write
250
+ tool. Keep `AURORA_API_TOKEN` out of commands, logs, and committed files by
251
+ providing it through your local secret environment. See
252
+ [CONTRIBUTING.md](CONTRIBUTING.md) before using the smoke.
236
253
 
237
254
  ## License
238
255
 
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * auroraClient.ts — AuroraCloud client helpers for the MCP server.
3
3
  *
4
- * SECURITY: Every query is scoped to the configured workspace.
5
- * On authenticate(), the server verifies the caller is a member of
6
- * that workspace — if not, the process exits.
4
+ * SECURITY: Client credentials discover only independently granted workspaces.
5
+ * Legacy credentials verify membership in their configured default workspace.
6
+ * Tool execution resolves a granted or verified workspace before data access.
7
7
  */
8
+ import type { AuroraConnectionContext, ContentReadResult, GrantedWorkspace } from './contracts.js';
8
9
  export type AuroraObjectRecord = {
9
10
  id: string;
10
11
  workspace_id: string;
@@ -44,11 +45,11 @@ export type AuroraTaskList = {
44
45
  name: string;
45
46
  default_status: string | null;
46
47
  };
47
- export declare const WORKSPACE_KNOWLEDGE_SOURCE_KINDS: readonly ["object", "content_chunk", "property", "comment", "attachment_metadata", "relationship"];
48
+ export declare const WORKSPACE_KNOWLEDGE_SOURCE_KINDS: readonly ['object', 'content_chunk', 'property', 'comment', 'attachment_metadata', 'relationship'];
48
49
  export type WorkspaceKnowledgeSourceKind = (typeof WORKSPACE_KNOWLEDGE_SOURCE_KINDS)[number];
49
- export declare const WORKSPACE_KNOWLEDGE_AVAILABILITY_STATES: readonly ["available", "encrypted_locked", "not_indexed", "unsupported_type", "permission_denied"];
50
+ export declare const WORKSPACE_KNOWLEDGE_AVAILABILITY_STATES: readonly ['available', 'encrypted_locked', 'not_indexed', 'unsupported_type', 'permission_denied'];
50
51
  export type WorkspaceKnowledgeAvailability = (typeof WORKSPACE_KNOWLEDGE_AVAILABILITY_STATES)[number];
51
- export declare const WORKSPACE_KNOWLEDGE_RELATIONSHIP_TYPES: readonly ["parent", "child", "link", "backlink", "tag", "task_project"];
52
+ export declare const WORKSPACE_KNOWLEDGE_RELATIONSHIP_TYPES: readonly ['parent', 'child', 'link', 'backlink', 'tag', 'task_project'];
52
53
  export type WorkspaceKnowledgeRelationshipType = (typeof WORKSPACE_KNOWLEDGE_RELATIONSHIP_TYPES)[number];
53
54
  export type WorkspaceKnowledgeRelationship = {
54
55
  type: WorkspaceKnowledgeRelationshipType;
@@ -86,13 +87,21 @@ type BackendAuthStore = {
86
87
  record: AuthRecord;
87
88
  save(token: string, record: AuthRecord): void;
88
89
  };
90
+ export type CollectionPage<T> = {
91
+ items: T[];
92
+ page: number;
93
+ perPage: number;
94
+ totalPages: number;
95
+ totalItems: number;
96
+ };
89
97
  type BackendCollection = {
90
- list(options?: {
98
+ listPage(options: {
91
99
  filter?: string;
92
100
  sort?: string;
93
101
  expand?: string;
94
- batch?: number;
95
- }): Promise<Array<Record<string, unknown>>>;
102
+ page: number;
103
+ perPage: number;
104
+ }): Promise<CollectionPage<Record<string, unknown>>>;
96
105
  get(id: string): Promise<Record<string, unknown>>;
97
106
  create(data: Record<string, unknown>): Promise<Record<string, unknown>>;
98
107
  update(id: string, data: Record<string, unknown>): Promise<Record<string, unknown>>;
@@ -116,13 +125,21 @@ export declare function getAuroraClient(): BackendClient;
116
125
  * Authenticate and verify workspace membership.
117
126
  * Exits the process if the user is not a member of the target workspace.
118
127
  */
128
+ export type AuthenticateOptions = {
129
+ token?: string;
130
+ workspaceId?: string;
131
+ };
132
+ export declare function listGrantedWorkspaces(): Promise<GrantedWorkspace[]>;
119
133
  export declare function authenticate(): Promise<void>;
134
+ export declare function authenticate(options: AuthenticateOptions): Promise<AuroraConnectionContext>;
120
135
  export declare function listObjects(workspaceId: string, type?: string): Promise<AuroraObjectRecord[]>;
136
+ export declare function listObjectsPage(workspaceId: string, type: string | undefined, page: number, perPage: number): Promise<CollectionPage<AuroraObjectRecord>>;
137
+ export declare function searchObjectsPage(workspaceId: string, query: string, limit: number): Promise<WorkspaceKnowledgeSource[]>;
121
138
  export declare function getObject(id: string, workspaceId: string): Promise<AuroraObjectRecord | null>;
122
139
  export declare function createObject(workspaceId: string, type: string, title: string): Promise<AuroraObjectRecord>;
123
140
  export declare function updateObjectTitle(id: string, title: string, workspaceId: string): Promise<void>;
124
141
  export declare function deleteObject(id: string, workspaceId: string): Promise<void>;
125
- export declare function getContent(objectId: string, workspaceId: string): Promise<string | null>;
142
+ export declare function getContent(objectId: string, workspaceId: string): Promise<ContentReadResult>;
126
143
  export declare function getContentJson(objectId: string, workspaceId: string): Promise<Record<string, unknown> | null>;
127
144
  export declare function searchWorkspaceKnowledgeServer(workspaceId: string, query: string, limit?: number): Promise<WorkspaceKnowledgeSource[]>;
128
145
  export declare function getWorkspaceKnowledgeObjectServer(workspaceId: string, objectId: string, includeFullText?: boolean): Promise<WorkspaceKnowledgeSource | null>;