@atoms-tech/atoms-mcp 0.4.2 → 0.5.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 +110 -1
- package/dist/apps/src/apps/editor/editor-app.html +25 -21
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -134,12 +134,121 @@ Add to your `claude_desktop_config.json`:
|
|
|
134
134
|
|
|
135
135
|
Add to your MCP configuration with `command: "npx"` and `args: ["@atoms-tech/atoms-mcp"]`. Refer to your editor's MCP documentation for the exact config file location.
|
|
136
136
|
|
|
137
|
+
## Org-Controlled Policy
|
|
138
|
+
|
|
139
|
+
Org admins can set guardrails (read-only mode, allowed toolsets, project scope, required confirmations) for every member of their org through **Org Settings → MCP Access Policy** in the ATOMS web app. Both this stdio package and the hosted MCP server (`https://<project>.supabase.co/functions/v1/mcp-server`) read the same `mcp_policy` table at session init, so an admin's policy applies regardless of how a user connects.
|
|
140
|
+
|
|
141
|
+
**Tenancy:** every policy row is scoped by `org_id`. Org A admins cannot read or modify Org B's policy — Row-Level Security enforces this at the database.
|
|
142
|
+
|
|
143
|
+
**Resolution order** (each layer can only narrow the previous, never widen):
|
|
144
|
+
|
|
145
|
+
1. Role baseline (admin / editor / viewer)
|
|
146
|
+
2. Org-default policy for that role
|
|
147
|
+
3. Optional per-user override
|
|
148
|
+
4. Operator env-var ceiling (this package, see below)
|
|
149
|
+
|
|
150
|
+
The operator env vars below are layered **on top** of the org policy. They're useful for stdio installs (per-machine lockdown) and CI bots; they don't replace the admin-set policy and they cannot widen it.
|
|
151
|
+
|
|
152
|
+
## Environment Variables
|
|
153
|
+
|
|
154
|
+
Tool exposure can be narrowed at startup so you only register what an agent needs. Both filters apply at server-init time — disabled tools never appear in the MCP tool list.
|
|
155
|
+
|
|
156
|
+
### `ATOMS_MCP_READ_ONLY`
|
|
157
|
+
|
|
158
|
+
Set to `1` (or `true`) to drop every mutating tool. Useful for analyst agents, CI summaries, or any context where writes shouldn't be possible.
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"mcpServers": {
|
|
163
|
+
"atoms-mcp": {
|
|
164
|
+
"command": "npx",
|
|
165
|
+
"args": ["@atoms-tech/atoms-mcp"],
|
|
166
|
+
"env": { "ATOMS_MCP_READ_ONLY": "1" }
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Affected tools (12): `atoms_create_item`, `atoms_update_item`, `atoms_delete_item`, `atoms_link_items`, `atoms_bulk_import`, `atoms_record_test_result`, `atoms_create_variable`, `atoms_update_variable`, `atoms_delete_variable`, `atoms_create_domain`, `atoms_update_domain`, `atoms_delete_domain`.
|
|
173
|
+
|
|
174
|
+
### `ATOMS_MCP_TOOLSETS`
|
|
175
|
+
|
|
176
|
+
Comma-separated list of toolsets to enable. When set, only tools in the named toolsets register (plus the always-on tools below). Unknown names are ignored.
|
|
177
|
+
|
|
178
|
+
| Toolset | Tools |
|
|
179
|
+
|---|---|
|
|
180
|
+
| `items` | list, get, search, browse, history, create, update, delete, bulk_import |
|
|
181
|
+
| `traceability` | trace, link_items, export_mermaid, impact_analysis |
|
|
182
|
+
| `coverage` | get_coverage, record_test_result, project_summary |
|
|
183
|
+
| `variables` | list/get/create/update/delete variables |
|
|
184
|
+
| `domains` | list/create/update/delete domains |
|
|
185
|
+
|
|
186
|
+
Always-on regardless of `ATOMS_MCP_TOOLSETS`: `atoms_status`, `atoms_list_projects`.
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
{ "env": { "ATOMS_MCP_TOOLSETS": "coverage,traceability" } }
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Combine with `ATOMS_MCP_READ_ONLY=1` for a tightly scoped read-only agent — e.g., a coverage-reporting CI job that can't accidentally mutate state.
|
|
193
|
+
|
|
194
|
+
### `ATOMS_MCP_REQUIRE_CONFIRMATION`
|
|
195
|
+
|
|
196
|
+
Force a two-step confirm flow on destructive tools so a runaway agent (or a prompt-injected tool argument) can't delete in a single call.
|
|
197
|
+
|
|
198
|
+
When set, the first call returns `{ status: "confirmation_required", preview, confirmation_token }` without performing the operation. The agent must then re-call with the issued `confirmation_token` to execute. Tokens are HMAC-SHA256 signed, expire in 60 seconds, and bind to the exact (tool, project, target) — they can't be reused or swapped between calls.
|
|
199
|
+
|
|
200
|
+
Accepted values:
|
|
201
|
+
|
|
202
|
+
| Value | Effect |
|
|
203
|
+
|---|---|
|
|
204
|
+
| `1`, `true`, `all` | Confirmation required for every supported destructive tool |
|
|
205
|
+
| `atoms_delete_item,atoms_bulk_import` | Comma-separated allowlist of tools that require it |
|
|
206
|
+
| unset | No confirmation required (default — preserves backward compatibility) |
|
|
207
|
+
|
|
208
|
+
Currently supported on: `atoms_delete_item`, `atoms_delete_variable`, `atoms_delete_domain`, `atoms_bulk_import`.
|
|
209
|
+
|
|
210
|
+
For `atoms_bulk_import` the token also binds to a hash of the items array — modifying any item between preview and confirm invalidates the token.
|
|
211
|
+
|
|
212
|
+
```json
|
|
213
|
+
{ "env": { "ATOMS_MCP_REQUIRE_CONFIRMATION": "atoms_delete_item,atoms_bulk_import" } }
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Optional: set `ATOMS_MCP_CONFIRMATION_SECRET` (≥16 chars) to make tokens survive process restarts. Otherwise the secret is regenerated each launch and tokens issued before a restart become invalid.
|
|
217
|
+
|
|
218
|
+
### `ATOMS_MCP_ORG_ID`
|
|
219
|
+
|
|
220
|
+
When you belong to multiple orgs, picks which one's MCP policy applies for this stdio session. Set to an org UUID. If unset, the package falls back to your earliest-joined org membership.
|
|
221
|
+
|
|
222
|
+
### `ATOMS_MCP_PROJECT_ID`
|
|
223
|
+
|
|
224
|
+
Bind the session to a single project. Every tool call's `project_id` argument must match — mismatches are rejected before the handler runs. `atoms_list_projects` filters its response to just the scoped project. Set to a project UUID; invalid values are ignored with a warning.
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
{ "env": { "ATOMS_MCP_PROJECT_ID": "11111111-2222-3333-4444-555555555555" } }
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Useful when an agent should only ever touch one project — for example, a CI bot dedicated to a single product line. Defense-in-depth on top of RLS, since it catches accidents (or prompt injections) that pass a different project_id.
|
|
231
|
+
|
|
232
|
+
### `ATOMS_RATE_LIMIT_RPM`
|
|
233
|
+
|
|
234
|
+
Override the default 60 requests/minute per-user rate limit. Set to a positive integer.
|
|
235
|
+
|
|
236
|
+
### `ATOMS_CLIENT_NAME`
|
|
237
|
+
|
|
238
|
+
Identifier persisted to the audit log so you can see which client (e.g., `cursor`, `claude-desktop`, `ci-coverage-bot`) made each call.
|
|
239
|
+
|
|
137
240
|
## Security
|
|
138
241
|
|
|
242
|
+
- **Org-isolated policy** — Every config knob set by Org A's admin lives in a row scoped to Org A's `org_id` and is invisible to Org B. RLS on the `mcp_policy` table is the boundary; the admin UI is purely a hide.
|
|
139
243
|
- **Row Level Security (RLS)** — All queries run with the user's JWT. The server never uses a service role key. You can only access projects your organization has granted you access to.
|
|
140
244
|
- **Role enforcement** — Write tools check your org role (viewer, editor, admin) before making changes. Viewers are blocked from mutations.
|
|
141
245
|
- **Audit logging** — Every tool call is logged with tool name, parameters, duration, and session ID. Write operations log to `change_history` with `actor: "mcp_claude"`.
|
|
142
|
-
- **Rate limiting** — Built-in per-user rate limiter
|
|
246
|
+
- **Rate limiting** — Built-in per-user sliding-window rate limiter (default 60 req/min, configurable).
|
|
247
|
+
- **Tool annotations** — Every tool declares `readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint` per the MCP spec, so capable hosts can surface accurate consent prompts.
|
|
248
|
+
- **Input caps** — Every string field has an explicit upper bound (body 50k, summary 2k, names 64, etc.) to prevent embedding-cost and memory-exhaustion attacks.
|
|
249
|
+
- **Output sanitization** — Error messages strip ASCII control, zero-width, and bidi-format characters from echoed user input, closing a reflected prompt-injection vector.
|
|
250
|
+
- **Confirmation tokens** — Destructive tools (`atoms_delete_*`, `atoms_bulk_import`) can be configured to require a two-step confirm flow with HMAC-signed tokens — see `ATOMS_MCP_REQUIRE_CONFIRMATION` above.
|
|
251
|
+
- **Project scoping** — `ATOMS_MCP_PROJECT_ID` binds a session to a single project and rejects tool calls referencing any other one — defense-in-depth on top of RLS.
|
|
143
252
|
- **No secrets in the package** — The Supabase anon key is a publishable client key (like a Firebase API key). It grants zero data access without a valid user JWT.
|
|
144
253
|
|
|
145
254
|
## Requirements
|