rootr-cli 0.16.0 → 0.17.1
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.ko.md +811 -0
- package/README.md +360 -652
- package/bin/rootr.js +1 -1
- package/lib/client.js +1 -1
- package/lib/credentials.js +30 -14
- package/lib/mcp-tools/crm.js +4 -2
- package/lib/mcp-tools/databases.js +3 -1
- package/lib/mcp-tools/documents.js +5 -3
- package/lib/mcp-tools/forms.js +4 -2
- package/lib/mcp-tools/issues.js +3 -2
- package/lib/mcp-tools/logs.js +3 -2
- package/lib/mcp-tools/pages.js +5 -1
- package/lib/mcp-tools/presentations.js +4 -2
- package/lib/mcp-tools/recordings.js +3 -2
- package/lib/mcp-tools/shared.js +9 -0
- package/lib/mcp-tools/signed.js +4 -1
- package/lib/mcp-tools/spreadsheets.js +6 -3
- package/lib/mcp-tools/whiteboards.js +4 -2
- package/lib/mcp-tools/workspaces.js +8 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,774 +1,468 @@
|
|
|
1
1
|
# rootr-cli
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Official CLI and MCP server for [Rootr](https://rootr.io) — a team documentation workspace that
|
|
4
|
+
AI agents can read **and write**.
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
Point Claude, Cursor, or any MCP client at your workspace and it can browse the document tree,
|
|
7
|
+
read and edit markdown, add rows to a database, open and close issues, build a slide deck, run a
|
|
8
|
+
spreadsheet, publish a public page, sign a document, or ask a question and get an answer with
|
|
9
|
+
citations back to the exact paragraph.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
*(한국어 문서: [README.ko.md](https://github.com/gwmage/rootr-cli/blob/main/README.ko.md))*
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
- `rootr` CLI — documents, databases, forms, signed documents, publishing, permissions, memory
|
|
14
|
+
- `rootr mcp` — stdio MCP server, **167 tools** (see [MCP tools](#mcp-tools))
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
- npm: https://www.npmjs.com/package/rootr-cli
|
|
17
|
-
- 원격 커넥터(설치 없이 바로 연결): `https://rootr.io/mcp` — Claude Code/Desktop 등에서
|
|
18
|
-
로컬 CLI 설치 없이 원격 MCP 엔드포인트로 바로 연결할 수 있습니다. 로컬 CLI(`rootr mcp`)와
|
|
19
|
-
기능은 동일하며, 자체 인프라에 CLI를 두고 싶을 때만 이 저장소를 설치하면 됩니다.
|
|
20
|
-
- 라이선스: MIT (`LICENSE` 참고)
|
|
16
|
+
Plain Node.js ESM, no build step. Node 18+ (uses the built-in `fetch`).
|
|
21
17
|
|
|
22
|
-
##
|
|
18
|
+
## Links
|
|
23
19
|
|
|
24
|
-
|
|
20
|
+
- Source: <https://github.com/gwmage/rootr-cli>
|
|
21
|
+
- npm: <https://www.npmjs.com/package/rootr-cli>
|
|
22
|
+
- Remote connector (nothing to install): `https://rootr.io/mcp`
|
|
23
|
+
- Docs: <https://rootr.io/en/docs> · authoring reference: <https://rootr.io/llms.txt>
|
|
24
|
+
- License: MIT (see `LICENSE`)
|
|
25
|
+
|
|
26
|
+
## Two ways to connect
|
|
27
|
+
|
|
28
|
+
**1. Remote connector — nothing to install.** Rootr hosts an MCP endpoint with OAuth:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
https://rootr.io/mcp
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Add it as a custom connector in Claude (Streamable HTTP), sign in, done. Same tools as the local
|
|
35
|
+
server. This is the recommended path for most people.
|
|
36
|
+
|
|
37
|
+
**2. Local CLI** — use this package when you want the client running on your own machine or
|
|
38
|
+
infrastructure, or when you want the shell commands.
|
|
25
39
|
|
|
26
40
|
```bash
|
|
27
|
-
|
|
28
|
-
npm install
|
|
41
|
+
npx rootr-cli mcp # run the MCP server straight from npm
|
|
42
|
+
npm install -g rootr-cli # or install the `rootr` command globally
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Or from a clone:
|
|
29
46
|
|
|
30
|
-
|
|
47
|
+
```bash
|
|
48
|
+
npm install
|
|
31
49
|
node bin/rootr.js --help
|
|
50
|
+
```
|
|
32
51
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
52
|
+
Docker:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
docker build -t rootr-cli .
|
|
56
|
+
docker run -i --rm -e ROOTR_API_KEY=rootr_xxx -e ROOTR_WORKSPACE=ws_123 rootr-cli
|
|
36
57
|
```
|
|
37
58
|
|
|
38
|
-
##
|
|
59
|
+
## Configuration
|
|
39
60
|
|
|
40
|
-
|
|
61
|
+
Precedence: **environment variables > `~/.rootr/config.json`**
|
|
41
62
|
|
|
42
|
-
|
|
|
63
|
+
| Env var | Config key | Description |
|
|
43
64
|
|---|---|---|
|
|
44
|
-
| `ROOTR_API_KEY` | `apiKey` | `rootr_...`
|
|
45
|
-
| `ROOTR_WORKSPACE` | `workspace` |
|
|
46
|
-
| `ROOTR_BASE_URL` | `baseUrl` |
|
|
65
|
+
| `ROOTR_API_KEY` | `apiKey` | API key (`rootr_...`), sent as the `x-api-key` header |
|
|
66
|
+
| `ROOTR_WORKSPACE` | `workspace` | Workspace id |
|
|
67
|
+
| `ROOTR_BASE_URL` | `baseUrl` | Defaults to `https://rootr.io/api/v1` |
|
|
47
68
|
|
|
48
|
-
|
|
69
|
+
Save them to the config file:
|
|
49
70
|
|
|
50
71
|
```bash
|
|
51
72
|
rootr config --api-key rootr_xxxxxxxxxxxxxxxx --workspace ws_123
|
|
52
|
-
#
|
|
73
|
+
# self-hosted or dev server
|
|
53
74
|
rootr config --api-key rootr_xxx --workspace ws_123 --base-url https://dev.rootr.io/api/v1
|
|
54
75
|
```
|
|
55
76
|
|
|
56
|
-
`~/.rootr/config.json
|
|
77
|
+
`~/.rootr/config.json` is written with mode `600`.
|
|
57
78
|
|
|
58
|
-
###
|
|
79
|
+
### Two kinds of key
|
|
59
80
|
|
|
60
|
-
|
|
81
|
+
- **Workspace key** — scoped to one workspace. Scopes: `docs:read`, `docs:write`, `graph:read`,
|
|
82
|
+
`ask`, `webhooks:manage`. Enough for almost every tool.
|
|
83
|
+
- **Account key (PAT)** — acts for the whole account. With the `workspaces:create` scope it can
|
|
84
|
+
create new workspaces (`rootr_create_workspace`). Trying that with a workspace key returns 403
|
|
85
|
+
with a hint saying an account key is required.
|
|
61
86
|
|
|
62
|
-
|
|
63
|
-
`docs:read`/`docs:write`/`graph:read`/`ask`/`webhooks:manage` 중 일부.
|
|
64
|
-
대부분의 문서/LOG/이슈/웹훅/ask 도구는 이 키로 충분합니다.
|
|
65
|
-
- **계정 키 (PAT)**: 사용자 계정 전체로 동작. `workspaces:create` 스코프가 있으면
|
|
66
|
-
새 워크스페이스를 만들 수 있습니다 (`rootr_create_workspace`). 워크스페이스 키로
|
|
67
|
-
워크스페이스 생성을 시도하면 403과 함께 계정 키가 필요하다는 힌트가 출력됩니다.
|
|
68
|
-
|
|
69
|
-
현재 설정 확인 (API 키는 앞 12자만 표시):
|
|
87
|
+
Show the current configuration (only the first 12 characters of the key are printed):
|
|
70
88
|
|
|
71
89
|
```bash
|
|
72
90
|
rootr config
|
|
73
|
-
# config file: /home/you/.rootr/config.json
|
|
74
|
-
# apiKey: rootr_abcd...
|
|
75
|
-
# workspace: ws_123
|
|
76
|
-
# baseUrl: https://rootr.io/api/v1
|
|
77
91
|
```
|
|
78
92
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
경로 인자 규칙: `/`로 시작하면 **경로**로 취급되어 by-path API로 노드 id를 알아냅니다
|
|
82
|
-
(워크스페이스 설정 필요). `/`로 시작하지 않으면 **노드 id**로 취급합니다.
|
|
93
|
+
### Working with several workspaces
|
|
83
94
|
|
|
84
|
-
|
|
95
|
+
Register each workspace's key once:
|
|
85
96
|
|
|
86
97
|
```bash
|
|
87
|
-
rootr
|
|
88
|
-
rootr
|
|
98
|
+
rootr config --add-key rootr_xxx --label "Sales"
|
|
99
|
+
rootr config # list registered keys
|
|
89
100
|
```
|
|
90
101
|
|
|
91
|
-
|
|
102
|
+
After that, `rootr use` (and the `rootr_use_workspace` MCP tool) accepts a **name, an id, or a
|
|
103
|
+
rootr.io URL**; the key that opens that workspace is selected and remembered automatically. An
|
|
104
|
+
account key (PAT) switches to any workspace you belong to.
|
|
92
105
|
|
|
93
|
-
|
|
106
|
+
A workspace key does not open anything outside its own workspace. Because of that, `rootr ws`
|
|
107
|
+
marks entries your registered keys cannot open — **being listed and being reachable are not the
|
|
108
|
+
same thing**.
|
|
94
109
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
rootr read /notes/todo.md --json # 메타데이터 포함 JSON 전체
|
|
98
|
-
rootr read <nodeId> # id로도 가능
|
|
99
|
-
```
|
|
110
|
+
Web URLs (`https://rootr.io/en/w/<ws>/d/<doc>`) can be pasted directly into any node argument.
|
|
111
|
+
If the URL belongs to another workspace, the error tells you to switch first.
|
|
100
112
|
|
|
101
|
-
|
|
113
|
+
> The remote connector (`https://rootr.io/mcp`) is bound to the single workspace you picked when
|
|
114
|
+
> you authorized it. For another workspace, issue a new connector for that workspace.
|
|
102
115
|
|
|
103
|
-
|
|
104
|
-
echo "# 제목" | rootr write /notes/new.md
|
|
105
|
-
rootr write /notes/new.md --file ./local.md
|
|
106
|
-
rootr write <nodeId> --file ./local.md --if-match "\"abc123\"" # 낙관적 동시성 제어
|
|
107
|
-
```
|
|
116
|
+
## CLI
|
|
108
117
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
"문서가 그 사이 변경됨: 다시 읽고 재시도" 힌트가 출력됩니다.
|
|
118
|
+
Path arguments starting with `/` are resolved as **paths** through the by-path API (needs a
|
|
119
|
+
workspace). Anything else is treated as a **node id**.
|
|
112
120
|
|
|
113
|
-
###
|
|
121
|
+
### Documents
|
|
114
122
|
|
|
115
123
|
```bash
|
|
116
|
-
rootr
|
|
117
|
-
rootr
|
|
118
|
-
cat diff.md | rootr append /notes/log.md
|
|
119
|
-
rootr append /notes/log.md --file ./chunk.md
|
|
120
|
-
```
|
|
124
|
+
rootr ls # whole tree, TYPE<TAB>path
|
|
125
|
+
rootr ls /notes # one subtree
|
|
121
126
|
|
|
122
|
-
|
|
123
|
-
|
|
127
|
+
rootr read /notes/todo.md # markdown to stdout
|
|
128
|
+
rootr read /notes/todo.md --json # full JSON with metadata
|
|
124
129
|
|
|
125
|
-
|
|
130
|
+
echo "# Title" | rootr write /notes/new.md
|
|
131
|
+
rootr write /notes/new.md --file ./local.md
|
|
132
|
+
rootr write <nodeId> --file ./local.md --if-match '"abc123"' # optimistic concurrency
|
|
126
133
|
|
|
127
|
-
|
|
128
|
-
rootr
|
|
134
|
+
rootr append /notes/log.md "deploy finished"
|
|
135
|
+
rootr append /notes/log.md "- one more item" --heading "## Todo"
|
|
136
|
+
cat diff.md | rootr append /notes/log.md
|
|
137
|
+
|
|
138
|
+
rootr edit /notes/todo.md --find "- [ ] deploy" --replace "- [x] deploy"
|
|
129
139
|
rootr edit /notes/todo.md --find "TODO" --replace "DONE" --all
|
|
140
|
+
|
|
141
|
+
rootr comments /notes/spec.md # comments, including ones left on the public page
|
|
142
|
+
rootr search "deployment runbook"
|
|
143
|
+
rootr mv /notes/old.md /archive/old.md # move and/or rename
|
|
144
|
+
rootr rm /notes/old.md --yes # to the trash, recoverable
|
|
145
|
+
rootr restore <id> # undo a delete (id, not path)
|
|
146
|
+
rootr attach ./diagram.png --doc /notes/spec.md --heading "## Design"
|
|
130
147
|
```
|
|
131
148
|
|
|
132
|
-
|
|
133
|
-
|
|
149
|
+
`append` never rewrites the whole document, so concurrent writers cannot clobber each other —
|
|
150
|
+
prefer it over `write`. `--heading` appends to the end of that heading's section.
|
|
134
151
|
|
|
135
|
-
|
|
152
|
+
`edit` returns 409 if the `--find` text is missing or not unique; the server's reason is printed
|
|
153
|
+
as-is. `write --if-match` returns 412 if the document changed in the meantime.
|
|
154
|
+
|
|
155
|
+
### Workspaces and questions
|
|
136
156
|
|
|
137
157
|
```bash
|
|
138
|
-
rootr
|
|
158
|
+
rootr ws # id<TAB>name
|
|
159
|
+
rootr use "Sales" # switch — id, name, or rootr.io URL
|
|
160
|
+
rootr ask "why did latency go up after last week's deploy?"
|
|
161
|
+
rootr ask "why did payment failures rise?" --workspace ws_123
|
|
139
162
|
```
|
|
140
163
|
|
|
141
|
-
|
|
164
|
+
`ask` queries the workspace knowledge graph (GraphRAG) and prints the answer plus citations in
|
|
165
|
+
`document path: quote` form. Requires the `ask` scope.
|
|
142
166
|
|
|
143
|
-
###
|
|
167
|
+
### Databases
|
|
144
168
|
|
|
145
169
|
```bash
|
|
146
|
-
rootr
|
|
147
|
-
rootr
|
|
170
|
+
rootr db create --file spec.json --parent /projects # columns in the given order, rows included
|
|
171
|
+
rootr db rows /projects/tasks --body --backlinks # rows, with row bodies and inbound links
|
|
172
|
+
rootr db row-add /projects/tasks --values '{"Title":"Ship v2","Status":"Doing"}'
|
|
173
|
+
rootr db rows-new /projects/tasks --file rows.json # many at once — all or nothing
|
|
174
|
+
rootr db rows-set /projects/tasks --ids r1,r2 --values '{"Status":"Done"}'
|
|
175
|
+
rootr db rows-each /projects/tasks --json '[{"rowId":"r1","values":{"Score":3}}]'
|
|
176
|
+
rootr db rows-rm /projects/tasks --ids r1,r2 --yes
|
|
177
|
+
rootr db view /projects/tasks Calendar --scale month # views: table, board, calendar, timeline
|
|
178
|
+
rootr db lock /projects/tasks --schema managers --rows own --locked "Approved,Score"
|
|
179
|
+
rootr db notify /projects/tasks --file rules.json # notification rules
|
|
180
|
+
rootr db buttons /projects/tasks --file buttons.json # buttons that do work when pressed
|
|
181
|
+
rootr db button-run /projects/tasks fill-summary --rows r1,r2
|
|
182
|
+
rootr db row-page <rowId> --type RECORDING # give one row a typed detail page
|
|
148
183
|
```
|
|
149
184
|
|
|
150
|
-
|
|
151
|
-
되돌리려면 `rootr restore <id>` — 화면에서 Ctrl+Z 를 누르는 것과 같은 일입니다.
|
|
152
|
-
**경로가 아니라 id** 입니다(휴지통에 든 것은 이미 트리에 없어 경로로는 못 찾습니다).
|
|
153
|
-
`rootr rm` 이 마지막 줄에 그 id 를 찍어 주니 그대로 쓰면 됩니다. MCP 로는
|
|
154
|
-
`rootr_restore_node`. `--yes` 없이 실행하면 확인을 묻습니다
|
|
155
|
-
(파이프/CI처럼 입력이 없는 환경에서는 "아니오"로 처리되어 안전합니다).
|
|
156
|
-
`docs:write` 스코프가 필요합니다.
|
|
157
|
-
|
|
158
|
-
### 워크스페이스 목록 · 전환
|
|
185
|
+
### Forms
|
|
159
186
|
|
|
160
187
|
```bash
|
|
161
|
-
rootr
|
|
162
|
-
|
|
188
|
+
rootr form new /intake/request --collect db \
|
|
189
|
+
--fields '[{"name":"Email","type":"email","required":true},{"name":"How urgent?","type":"scale"}]'
|
|
190
|
+
rootr form show /intake/request # read the questions before changing them
|
|
191
|
+
rootr form set /intake/request --fields '[...]' # replaces the question set
|
|
192
|
+
rootr form collect /intake/request --to sheet # create and wire a destination
|
|
193
|
+
rootr form responses /intake/request --latest # --latest = newest one per person
|
|
194
|
+
rootr form response-edit <responseId> --values '{"Email":"a@b.com"}'
|
|
163
195
|
```
|
|
164
196
|
|
|
165
|
-
`
|
|
166
|
-
보이지만 열 수 없는 워크스페이스에 `[등록된 키로는 접근 불가]`가 붙습니다 — 목록에 보이는
|
|
167
|
-
것과 접근되는 것은 다릅니다. `rootr use`는 그 워크스페이스를 여는 키를 골라 함께 기억합니다.
|
|
197
|
+
`--fields` takes a JSON array as a **string**, not a file path.
|
|
168
198
|
|
|
169
|
-
|
|
199
|
+
18 question types, including `text`, `email`, `phone`, `url`, `rating`, `scale`, `time`, `file`,
|
|
200
|
+
`matrix`, `ranking`, `csat` and `nps`. `--collect db|sheet` creates the destination and wires it
|
|
201
|
+
up, mapping questions to columns.
|
|
170
202
|
|
|
171
|
-
|
|
203
|
+
### Publishing and access
|
|
172
204
|
|
|
173
205
|
```bash
|
|
174
|
-
rootr
|
|
175
|
-
rootr
|
|
206
|
+
rootr publish /handbook --children # works for every node type
|
|
207
|
+
rootr publish /handbook --status # is it public, at what URL, children included?
|
|
208
|
+
rootr publish /projects/tasks --layout board --skin paper # 9 layouts × 6 skins
|
|
209
|
+
rootr publish /handbook/policy.md --comments --expires 2026-12-31T00:00:00Z
|
|
210
|
+
rootr publish /handbook --off
|
|
211
|
+
|
|
212
|
+
rootr access /handbook --private # or --public / --inherit
|
|
213
|
+
rootr access /handbook --grant <userId> --level WRITE
|
|
214
|
+
rootr access /handbook --revoke <userId>
|
|
215
|
+
|
|
216
|
+
rootr readreq /handbook/policy.md --users u1,u2 --due 2026-10-01T00:00:00Z --ack
|
|
217
|
+
rootr readreq /handbook/policy.md # who has read it, completion rate
|
|
176
218
|
```
|
|
177
219
|
|
|
178
|
-
|
|
179
|
-
워크스페이스가 바뀌고, 그 워크스페이스를 담당하는 키가 자동으로 선택·기억됩니다. 계정
|
|
180
|
-
키(PAT)를 쓰면 소속된 어느 워크스페이스로든 바로 전환됩니다.
|
|
181
|
-
|
|
182
|
-
워크스페이스 키는 자기 워크스페이스 밖에서는 열리지 않습니다 — `rootr ws`(=`rootr_workspaces`)
|
|
183
|
-
목록에 보여도 접근은 안 되는 경우가 있어, 등록된 키가 워크스페이스 키뿐이면 목록에
|
|
184
|
-
`[등록된 키로는 접근 불가]`를 함께 표시합니다.
|
|
185
|
-
|
|
186
|
-
문서를 가리키는 웹 주소(`https://rootr.io/ko/w/<ws>/d/<doc>`)는 `rootr_read` 등 모든 노드
|
|
187
|
-
인자에 그대로 붙여넣을 수 있습니다. 다른 워크스페이스의 주소면 "먼저 전환하라"고 알려줍니다.
|
|
188
|
-
|
|
189
|
-
> 원격 커넥터(`https://rootr.io/mcp`)는 승인할 때 고른 워크스페이스 하나에만 연결됩니다.
|
|
190
|
-
> 다른 워크스페이스가 필요하면 그 워크스페이스로 커넥터를 새로 발급하세요.
|
|
191
|
-
|
|
192
|
-
### 사용량 한도
|
|
193
|
-
|
|
194
|
-
프로그램(API 키·MCP) 호출 중 **조회 계열**(`docs:read`/`graph:read`/`ask`)에만 한도가 있습니다.
|
|
195
|
-
쓰기·업로드는 제한하지 않습니다.
|
|
196
|
-
|
|
197
|
-
| 플랜 | 한도 |
|
|
198
|
-
| --- | --- |
|
|
199
|
-
| Free | **하루 180회** (KST 자정 리셋) |
|
|
200
|
-
| Team | 시간당 5,000회 |
|
|
201
|
-
| Business | 시간당 50,000회 |
|
|
202
|
-
| Platform | 무제한 |
|
|
203
|
-
|
|
204
|
-
한도의 80%를 쓰면 MCP 도구 응답 끝에 남은 횟수 안내가 붙고, 다 쓰면 429와 함께
|
|
205
|
-
업그레이드 링크가 담긴 안내가 나옵니다. 응답 헤더로도 확인할 수 있습니다
|
|
206
|
-
(`X-RateLimit-Remaining`, `X-RateLimit-Reset`, `X-RateLimit-Window`).
|
|
207
|
-
|
|
208
|
-
### 서명문서 · 연구노트 (sign)
|
|
220
|
+
### Signed documents and research notes
|
|
209
221
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
222
|
+
A signed document is a markdown document whose body **freezes the moment it is submitted**; the
|
|
223
|
+
people on the approval line then sign in order. Every signature carries a trusted timestamp (TSA)
|
|
224
|
+
and hash chaining, so tampering is provable, and signed documents are never deleted (30-year
|
|
225
|
+
retention). Corporate approval flows and national R&D electronic research notes are the same
|
|
226
|
+
feature.
|
|
214
227
|
|
|
215
228
|
```bash
|
|
216
|
-
#
|
|
217
|
-
rootr sign new "
|
|
229
|
+
# create — body and approval line in one step; a research note only needs a reviewer
|
|
230
|
+
rootr sign new "/notes/2026-08-25 experiment" --file note.md --reviewer <reviewer userId>
|
|
218
231
|
|
|
219
|
-
#
|
|
232
|
+
# build the approval line by hand (array order = signing order)
|
|
220
233
|
cat > line.json <<'EOF'
|
|
221
|
-
[ { "label": "
|
|
222
|
-
{ "label": "
|
|
234
|
+
[ { "label": "Author", "members": [{ "userId": "u1", "role": "AUTHOR" }] },
|
|
235
|
+
{ "label": "Manager", "rule": "ANY", "members": [{ "userId": "u2" }, { "userId": "u3" }] } ]
|
|
223
236
|
EOF
|
|
224
|
-
rootr sign line
|
|
237
|
+
rootr sign line "/notes/2026-08-25 experiment" --file line.json
|
|
225
238
|
|
|
226
|
-
#
|
|
227
|
-
rootr sign code
|
|
228
|
-
rootr sign submit
|
|
239
|
+
# submit: request a confirmation code by email, then pass those 6 digits
|
|
240
|
+
rootr sign code "/notes/2026-08-25 experiment"
|
|
241
|
+
rootr sign submit "/notes/2026-08-25 experiment" --code 123456
|
|
229
242
|
|
|
230
|
-
#
|
|
243
|
+
# next signer: see only what is waiting on you, then sign (or reject with a reason)
|
|
231
244
|
rootr sign list --pending
|
|
232
245
|
rootr sign code <id> && rootr sign approve <id> --code 123456
|
|
233
|
-
rootr sign reject <id> --comment "
|
|
246
|
+
rootr sign reject <id> --comment "supporting data is missing" --code 123456
|
|
234
247
|
|
|
235
|
-
#
|
|
248
|
+
# many at once (up to 100 with a single code)
|
|
236
249
|
rootr sign code --bulk
|
|
237
250
|
rootr sign bulk <id1> <id2> <id3> --code 123456
|
|
238
251
|
|
|
239
|
-
#
|
|
240
|
-
rootr sign verify <id> #
|
|
241
|
-
rootr sign ledger #
|
|
252
|
+
# proof
|
|
253
|
+
rootr sign verify <id> # body, signatures, timestamps and ledger intact?
|
|
254
|
+
rootr sign ledger # recompute the whole workspace ledger
|
|
242
255
|
```
|
|
243
256
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
10
|
|
257
|
+
**The CLI cannot mint the confirmation code for you.** It is emailed to the signer only. In a
|
|
258
|
+
design where the server holds the private key, that code is the single piece of evidence that a
|
|
259
|
+
human pressed the button. It is valid for 10 minutes, dies after 5 wrong attempts, and a repeat
|
|
260
|
+
request within 30 seconds is refused.
|
|
247
261
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
요구하기 때문입니다.
|
|
262
|
+
Approval-line members are `{"userId"}` or `{"email","displayName"}` — with an email address a
|
|
263
|
+
person can sign without a Rootr account.
|
|
251
264
|
|
|
252
|
-
|
|
265
|
+
A signed document is never edited in place. You issue a **revision**
|
|
266
|
+
(`rootr sign revise <id> --note "…"`) and the original stays as `SUPERSEDED`, because the
|
|
267
|
+
regulations require both the original and the trace of the change to remain visible.
|
|
268
|
+
|
|
269
|
+
### Team memory
|
|
253
270
|
|
|
254
271
|
```bash
|
|
255
|
-
rootr
|
|
256
|
-
rootr
|
|
257
|
-
|
|
272
|
+
rootr memory # recall everything
|
|
273
|
+
rootr memory --query seminar --kind 지시 # filtered
|
|
274
|
+
rootr memory add "Report times in KST only" --kind 지시 --source /rules.md
|
|
275
|
+
rootr memory edit <id> --content "corrected sentence" # only the fields you pass change
|
|
276
|
+
rootr memory forget <id> # retire (--hard deletes the row)
|
|
258
277
|
```
|
|
259
278
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
`--kind`는 `bug`(안 되는 것) · `friction`(되지만 불편·헷갈림) · `idea`(있으면 좋겠다) ·
|
|
265
|
-
`praise` · `other` 중 하나이며, 생략하면 `other`입니다. `--title`을 안 주면 본문 첫
|
|
266
|
-
줄이 제목이 됩니다. 답을 받고 싶을 때만 `--email`을 주세요.
|
|
279
|
+
`--kind` is one of four literal values: `지시` (how the team wants work done), `사람` (someone's
|
|
280
|
+
role or preference), `프로젝트` (an ongoing effort), `참고` (a reference). The same four values
|
|
281
|
+
are the enum on the `rootr_remember` / `rootr_recall` MCP tools.
|
|
267
282
|
|
|
268
|
-
|
|
269
|
-
|
|
283
|
+
One-line facts that outlive a session and are shared by the whole workspace. This is the same
|
|
284
|
+
data as the `rootr_remember` / `rootr_recall` / `rootr_forget` MCP tools and the "Memory" menu in
|
|
285
|
+
the app. **Long things belong in a document; one-liners belong in memory.**
|
|
270
286
|
|
|
271
|
-
###
|
|
287
|
+
### Scaffolding a workspace
|
|
272
288
|
|
|
273
289
|
```bash
|
|
274
|
-
rootr
|
|
275
|
-
rootr
|
|
290
|
+
rootr scaffold plan "a workspace for running a hardware startup's QA process"
|
|
291
|
+
rootr scaffold review --file tree.json # get graded before anything is created
|
|
292
|
+
rootr scaffold apply --file tree.json --root /qa
|
|
293
|
+
rootr scaffold built --root /qa # inspect the shape of what was created
|
|
294
|
+
rootr scaffold test --root /qa # actually exercise relations, rollups, formulas, forms
|
|
276
295
|
```
|
|
277
296
|
|
|
278
|
-
|
|
279
|
-
`ask` 스코프가 필요합니다. `--workspace`를 생략하면 설정된 기본 워크스페이스를 사용합니다.
|
|
280
|
-
|
|
281
|
-
### 팀의 기억 (memory)
|
|
297
|
+
### Reporting a problem
|
|
282
298
|
|
|
283
299
|
```bash
|
|
284
|
-
rootr
|
|
285
|
-
rootr
|
|
286
|
-
|
|
287
|
-
rootr memory edit <id> --content "고친 문장" # 그 기억만 고치기(준 칸만 바뀜)
|
|
288
|
-
rootr memory edit <id> --kind 참고 # 종류만 고치기
|
|
289
|
-
rootr memory forget <id> # 폐기(--hard면 행 삭제)
|
|
300
|
+
rootr feedback "rootr_add_row could not find my column by name; column ids worked." --kind friction
|
|
301
|
+
rootr feedback --file report.md --kind bug --email me@example.com
|
|
302
|
+
cat error.log | rootr feedback --kind bug
|
|
290
303
|
```
|
|
291
304
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
기억으로** — 자세한 규칙은 MCP 도구 설명을 참고하세요.
|
|
305
|
+
Sends bugs, friction and ideas to the Rootr team. **No login, no workspace, no API key required**
|
|
306
|
+
— it works even when a wrong key means nothing else does, and that is exactly the report we most
|
|
307
|
+
want. It does not count against usage limits and does not consume credits.
|
|
296
308
|
|
|
297
|
-
|
|
309
|
+
`--kind` is one of `bug`, `friction`, `idea`, `praise`, `other` (default `other`). Without
|
|
310
|
+
`--title` the first line of the body becomes the title. Pass `--email` only if you want a reply.
|
|
311
|
+
The same body sent twice within 10 minutes is merged into one report, so retry loops do not
|
|
312
|
+
pollute the queue.
|
|
298
313
|
|
|
299
|
-
|
|
314
|
+
## Usage limits
|
|
300
315
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
받습니다 — CLI와 같은 규칙으로 `/`로 시작하면 경로로 해석합니다.
|
|
304
|
-
즉 `rootr_add_row`에 `databaseId: "/제작 공정/칸반"`을 그대로 넘길 수 있어,
|
|
305
|
-
경로만 아는 에이전트가 uuid를 찾아 헤맬 필요가 없습니다.
|
|
306
|
-
`rootr_list`·`rootr_search` 출력도 각 줄 끝에 `[노드 id]`를 함께 표시합니다.
|
|
316
|
+
Only **read-type** calls (`docs:read` / `graph:read` / `ask`) made programmatically (API key or
|
|
317
|
+
MCP) are metered. Writes and uploads are not limited.
|
|
307
318
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
|
311
|
-
|
|
312
|
-
|
|
|
313
|
-
|
|
|
314
|
-
| `rootr_append` | **(권장)** 문서에 안전하게 추가 — 충돌 불가능 |
|
|
315
|
-
| `rootr_edit` | 정확한 텍스트 스니펫 치환 |
|
|
316
|
-
| `rootr_write` | 문서 전체 교체(파괴적) 또는 신규 생성 |
|
|
317
|
-
| `rootr_search` | 워크스페이스 검색 |
|
|
318
|
-
| `rootr_comment_document` | 문서에 댓글 달기 |
|
|
319
|
-
| `rootr_list_document_comments` | 문서에 달린 댓글 목록 |
|
|
320
|
-
| `rootr_duplicate_node` | 노드 통째로 복제(하위까지) |
|
|
321
|
-
| `rootr_move_node` | 노드 옮기기 / 이름 바꾸기 |
|
|
322
|
-
|
|
323
|
-
에이전트에게는 가능하면 `rootr_append`/`rootr_edit`을 우선 사용하고,
|
|
324
|
-
`rootr_write`는 정말 전체를 다시 쓸 때만 (가능하면 `ifMatch`와 함께) 쓰도록
|
|
325
|
-
각 도구 설명에 명시되어 있습니다.
|
|
326
|
-
|
|
327
|
-
#### 첨부파일 (workspace 키, docs:write)
|
|
319
|
+
| Plan | Limit |
|
|
320
|
+
| --- | --- |
|
|
321
|
+
| Free | **180 calls per day** (resets at midnight KST) |
|
|
322
|
+
| Team | 5,000 per hour |
|
|
323
|
+
| Business | 50,000 per hour |
|
|
324
|
+
| Platform | Unlimited |
|
|
328
325
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
| `rootr_attach_image_to_document` | 위 업로드 + 지정 문서에 `rootr_append`로 바로 삽입 (가장 흔한 용법) |
|
|
326
|
+
At 80% of the limit, MCP tool responses append a note with the remaining count. At the limit you
|
|
327
|
+
get a 429 with an upgrade link. The response headers carry the same information
|
|
328
|
+
(`X-RateLimit-Remaining`, `X-RateLimit-Reset`, `X-RateLimit-Window`).
|
|
333
329
|
|
|
334
|
-
|
|
335
|
-
그대로 쓸 수 있습니다. CLI에서는 `rootr attach <file> [--doc <path|id>] [--heading "## X"] [--alt <text>]`.
|
|
330
|
+
## MCP tools
|
|
336
331
|
|
|
337
|
-
|
|
332
|
+
`rootr mcp` speaks MCP over stdio. 167 tools:
|
|
338
333
|
|
|
339
|
-
|
|
|
334
|
+
| Group | Count | Tools |
|
|
340
335
|
|---|---|---|
|
|
341
|
-
|
|
|
342
|
-
|
|
|
343
|
-
|
|
|
344
|
-
|
|
|
345
|
-
|
|
|
346
|
-
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
|
355
|
-
|
|
356
|
-
|
|
|
357
|
-
|
|
|
358
|
-
|
|
|
359
|
-
|
|
|
360
|
-
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
| `rootr_delete_webhook` | 웹훅 삭제 |
|
|
386
|
-
|
|
387
|
-
#### 표(DATABASE) — 행과 열 (docs:read/docs:write)
|
|
388
|
-
|
|
389
|
-
| 도구 | 설명 |
|
|
390
|
-
|---|---|
|
|
391
|
-
| `rootr_read_database` | 스키마(열 정의)+행 전체 읽기 — **다른 표 도구를 쓰기 전에 먼저** (`includeBody: true` 면 행마다 상세 내용까지) |
|
|
392
|
-
| `rootr_list_rows` | 행만 조회(스키마 제외, `includeBody` 지원, `backlinks: true`면 "나를 가리키는 다른 표의 행"도 함께) |
|
|
393
|
-
| `rootr_add_row` | 행 추가 (`values`는 열 이름 또는 id로 지정, `body`로 상세 내용까지) |
|
|
394
|
-
| `rootr_update_row` | 행 수정 (칸반 카드 이동 = select 열 값 변경, `body`로 상세 내용 교체) |
|
|
395
|
-
| `rootr_bulk_create_rows` | 행 여러 개를 한 번에 추가 |
|
|
396
|
-
| `rootr_bulk_update_rows` | 여러 행을 **같은 값**으로 한 번에 수정 |
|
|
397
|
-
| `rootr_bulk_update_rows_each` | 여러 행을 **행마다 다른 값**으로 한 번에 수정 |
|
|
398
|
-
| `rootr_delete_row` | 행 삭제 |
|
|
399
|
-
| `rootr_bulk_delete_rows` | 행 여러 개를 한 번에 삭제 |
|
|
400
|
-
| `rootr_create_view` | 보기 추가 — 테이블/보드/캘린더/타임라인/갤러리 (달력은 `calendarScale`로 주·달·해) |
|
|
401
|
-
| `rootr_update_view` | 보기 수정 — 열 숨기기·이름·그룹·필터·정렬·열 너비·달력 단위(`calendarScale`) |
|
|
402
|
-
| `rootr_delete_view` | 보기 삭제 |
|
|
403
|
-
| `rootr_create_row_page` | 행에 상세 페이지 붙이기(문서 또는 서명문서) |
|
|
404
|
-
| `rootr_set_row_page_type` | 앞으로 만드는 행이 무엇으로 열릴지 정하기 |
|
|
405
|
-
| `rootr_unlink_row_page` | 행과 상세 페이지의 연결 끊기 |
|
|
406
|
-
| `rootr_add_column` | **열 추가** — 기존 열·행은 그대로 |
|
|
407
|
-
| `rootr_update_column` | 열 이름 변경 / select 선택지 교체 |
|
|
408
|
-
| `rootr_delete_column` | 열 삭제(파괴적) |
|
|
409
|
-
| `rootr_read_database_permissions` | 표에 걸린 자물쇠 보기 |
|
|
410
|
-
| `rootr_set_database_permissions` | 표 잠그기 — 칸·뷰 잠금 / 본인 행만 / 관리자만 고칠 칸 |
|
|
411
|
-
| `rootr_read_database_notifications` | 표 알림 규칙 보기 |
|
|
412
|
-
| `rootr_set_database_notifications` | 표 알림 규칙 저장 — 누구에게·언제·어떤 것만 |
|
|
413
|
-
| `rootr_list_database_buttons` | 표 위 **버튼** 목록 보기(고칠 수 있는지 `myLevel`도 함께) |
|
|
414
|
-
| `rootr_set_database_buttons` | 버튼 만들고 고치기 — **목록 통째로 교체**(남길 것도 같이 보내야 함) |
|
|
415
|
-
| `rootr_run_database_button` | 버튼 누르기 — 행 만들기·값 채우기·AI로 칸 채우기가 순서대로 |
|
|
416
|
-
| `rootr_list_document_commits` | 공개 문서에 온 변경 제안 목록 |
|
|
417
|
-
| `rootr_merge_document_commit` | 변경 제안 반영(세 벌 병합 — 덮어쓰기 아님) |
|
|
418
|
-
| `rootr_reject_document_commit` | 변경 제안 거절(사유는 제안자에게 전달) |
|
|
419
|
-
| `rootr_read_node_access` | 이 문서·폴더를 누가 볼 수 있는지(공개범위 + 따로 준 권한) |
|
|
420
|
-
| `rootr_set_node_visibility` | 비공개로 잠그기 / 상위 설정 따르기 |
|
|
421
|
-
| `rootr_grant_node_permission` | 한 사람(또는 그룹)에게 READ·WRITE·MANAGE 주기 |
|
|
422
|
-
| `rootr_revoke_node_permission` | 준 권한 거두기 |
|
|
423
|
-
| `rootr_update_form_response` | 이미 들어온 폼 응답 고치기(폼 검사 규칙 다시 통과) |
|
|
424
|
-
| `rootr_delete_form_response` | 폼 응답 한 건 삭제 |
|
|
425
|
-
| `rootr_create_form_collector` | 응답 모을 표·스프레드시트를 **만들어서** 연결(표는 질문 그대로 칸 생성) |
|
|
426
|
-
|
|
427
|
-
**표 버튼 — 매번 하는 준비 동작을 한 번에.** 새 건이 생길 때마다 상태=접수, 담당=나,
|
|
428
|
-
마감=오늘+7 을 손으로 다시 채우는 일을 버튼 하나로 만듭니다. 단계는 **적힌 순서대로**
|
|
429
|
-
돌고 **앞 단계가 만든 행을 뒤 단계가 받으므로**, "행을 만들고 → 그 행의 요약을 AI가 쓰고
|
|
430
|
-
→ 그 행을 연다"가 한 번 누름으로 끝납니다. 값에는 `@today` · `@today+7` · `@me` 를 쓸 수
|
|
431
|
-
있고 누르는 그 시점에 채워집니다. 버튼은 권한을 늘리지 않습니다 — **누른 사람 권한 그대로**
|
|
432
|
-
돕니다(만들기·고치기는 관리자, 누르기는 편집 권한).
|
|
433
|
-
|
|
434
|
-
```bash
|
|
435
|
-
rootr db buttons <표> # 지금 달린 버튼 보기
|
|
436
|
-
rootr db buttons <표> --file buttons.json # 목록 통째로 저장(남길 것도 같이)
|
|
437
|
-
rootr db button-run <표> <버튼id> # 한 번 누르기 (--rows id,id 로 고른 행 지정)
|
|
438
|
-
rootr db view <표> <뷰> --scale year # 달력 보기를 주·달·해 중에서
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
```json
|
|
442
|
-
[{ "label": "접수", "icon": "📥", "steps": [
|
|
443
|
-
{ "kind": "add_row", "values": { "상태": "접수", "담당": "@me", "마감": "@today+7" } },
|
|
444
|
-
{ "kind": "ai_fill", "target": "created", "propId": "요약", "prompt": "{제목}을 한 문장으로 요약해." },
|
|
445
|
-
{ "kind": "open_row" }
|
|
446
|
-
] }]
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
스캐폴드로 표를 지을 때도 `database.buttons` 에 같은 모양을 넣으면 **표와 함께** 달립니다.
|
|
450
|
-
|
|
451
|
-
**행에 댓글 달기.** 표의 한 행에 댓글을 달려면 `rootr_comment_document` 에 **표**를
|
|
452
|
-
`target` 으로, **행 id**를 `blockId` 으로 줍니다(읽기는 `rootr_list_document_comments`,
|
|
453
|
-
명령줄은 `rootr comments <표> --block <행id>`). 상세 문서가 없는 행에도 달립니다.
|
|
454
|
-
`@[userId]` 로 사람을 부르면 알림이 가고, 그 알림은 **그 행**을 열면서 댓글을 짚어 줍니다.
|
|
455
|
-
|
|
456
|
-
**사람 칸은 여러 명을 담습니다.** 회의 참석자·공동 담당처럼 여럿이 들어가는 자리가
|
|
457
|
-
흔해서, 값은 이름 목록(`["김대표","이팀장"]`)입니다. 이름 하나만 보내도 받아 주고
|
|
458
|
-
목록으로 맞춰 돌려줍니다. 새로 들어온 사람에게만 알림이 갑니다.
|
|
459
|
-
|
|
460
|
-
**"만들면서 같이 잠그기".** 공개범위는 스캐폴드 트리에서도 노드마다 지정할 수 있습니다 —
|
|
461
|
-
`{ name: "채용", visibility: "PRIVATE", access: [{ subjectId: "<userId>", level: "READ" }] }`.
|
|
462
|
-
폴더는 만들어 주면서 잠그는 건 사람이 따로 해야 하는 상태가 되지 않도록, 한 번에 갑니다.
|
|
463
|
-
명령줄에서는 `rootr access <경로|id> --private`, `--grant <userId> --level READ`,
|
|
464
|
-
`--revoke <userId>` 입니다. (웹에 공개하는 것과는 다릅니다 — 그건 `rootr_set_document_public`.)
|
|
465
|
-
|
|
466
|
-
응답 모을 곳은 `rootr form collect <폼> --to db|sheet`로 **만들면서** 연결합니다 —
|
|
467
|
-
표로 만들면 폼 질문 그대로 칸이 생기므로, 표를 미리 만들고 칸 이름을 맞출 필요가 없습니다
|
|
468
|
-
(이름이 하나라도 어긋나면 그 칸은 영영 빈 칸으로 남습니다). 스캐폴드 트리에서는 폼 노드에
|
|
469
|
-
`form.collectInto: "database" | "spreadsheet"`로 같은 일을 합니다.
|
|
470
|
-
|
|
471
|
-
폼 응답은 `rootr form responses <폼> [--latest]`로 보고, `rootr form response-edit <응답id>
|
|
472
|
-
--values '{"필드id":"값"}'`로 고치고, `rootr form response-rm <응답id> --yes`로 지웁니다.
|
|
473
|
-
`--latest`는 같은 사람이 여러 번 낸 것 중 마지막 한 건만 남깁니다(익명 제출은 합치지 않습니다).
|
|
474
|
-
|
|
475
|
-
행의 **상세 내용(본문 메모)** — 화면에서 칸반 카드를 열면 속성 아래에 적는 그 글 — 은
|
|
476
|
-
`body`로 오갑니다. 실체는 표 밑에 달리는 문서 한 장이고, 없으면 쓸 때 만들어집니다.
|
|
477
|
-
명령줄에서도 됩니다: `rootr db row-add <표> --values '{"제목":"킥오프"}' --body "..."`,
|
|
478
|
-
`rootr db row-body <표> <rowId> --file memo.md`, `rootr db rows <표> --body`.
|
|
479
|
-
|
|
480
|
-
열은 **한 번에 하나씩** 다룹니다. REST의 `PATCH /databases/:id`는 `properties`
|
|
481
|
-
배열을 통째로 교체하기 때문에, 에이전트가 배열을 다시 만들다 빠뜨린 열이 그대로
|
|
482
|
-
사라집니다. 위 세 도구는 서버가 병합하므로 나머지 열이 없어지지 않습니다.
|
|
483
|
-
|
|
484
|
-
- **열을 추가해도 기존 행 데이터는 건드리지 않습니다** — 새 열은 값이 채워지기 전까지 빈 칸으로 읽힙니다.
|
|
485
|
-
- **열의 `type`은 바꿀 수 없습니다**(모든 행의 값을 다시 써야 하므로). 새 열을 만들어 값을 옮기세요.
|
|
486
|
-
- `title` 열은 추가로 만들 수도, 삭제할 수도 없습니다.
|
|
487
|
-
- 삭제한 열의 값은 행 안에 남아 있지만 화면에는 나오지 않습니다 — 사용자 확인 후 호출하세요.
|
|
488
|
-
|
|
489
|
-
#### 폼(FORM) — 받아 적는 창구 (docs:read/docs:write)
|
|
490
|
-
|
|
491
|
-
| 도구 | 설명 |
|
|
492
|
-
|---|---|
|
|
493
|
-
| `rootr_create_form` | 폼 만들기 — 질문 정의·응답 모을 표(`targetDatabaseId`)까지 한 번에 |
|
|
494
|
-
| `rootr_read_form` | 질문 정의와 설정 읽기 — **고치기 전에 먼저** |
|
|
495
|
-
| `rootr_update_form` | 질문·설정 수정(`config`는 아래 설명 참고) |
|
|
496
|
-
| `rootr_create_form_collector` | 응답 모을 표·스프레드시트를 **만들어서** 연결(표는 질문 그대로 칸 생성) |
|
|
497
|
-
| `rootr_list_form_responses` | 들어온 응답 목록 |
|
|
498
|
-
| `rootr_submit_form_response` | 응답 한 건 제출(사람 대신 넣어 줄 때) |
|
|
499
|
-
| `rootr_update_form_response` | 이미 들어온 응답 고치기(폼 검사 규칙 다시 통과) |
|
|
500
|
-
| `rootr_delete_form_response` | 응답 한 건 삭제 |
|
|
501
|
-
| `rootr_create_form_share_link` | 폼 전용 공유 링크 발급(`/f/<토큰>`) |
|
|
502
|
-
| `rootr_list_form_share_links` | 발급된 공유 링크 목록 |
|
|
503
|
-
|
|
504
|
-
폼을 밖에 여는 정상 경로는 **`rootr_publish_node`** 입니다 — 발행하면 `/p/<슬러그>`
|
|
505
|
-
주소가 나오고 **응답 받기도 같이 켜집니다**. `config.publicSubmit`을 손으로 만질 일은
|
|
506
|
-
거의 없고, 그만 받고 싶으면 `closesAt`·`maxResponses`를 걸거나 발행을 내리세요.
|
|
507
|
-
`config.theme`은 `clean`·`paper`·`noir`·`ocean`·`sunset`·`mint`·`bento`·`brutal`·
|
|
508
|
-
`vivid`·`dark` 10종이며, `cover`/`logo`는 이미지 **주소**라 `rootr_upload_attachment`로
|
|
509
|
-
먼저 올리고 받은 url을 넣습니다(비워 두면 기본 커버가 붙습니다).
|
|
510
|
-
|
|
511
|
-
#### 웹에 공개 발행 (docs:write)
|
|
512
|
-
|
|
513
|
-
| 도구 | 설명 |
|
|
514
|
-
|---|---|
|
|
515
|
-
| `rootr_publish_node` | **아무 노드나** 공개 — 문서·표·폼·시트·화이트보드·덱, 하위까지 |
|
|
516
|
-
| `rootr_set_node_public` | 이미 공개한 것의 설정 변경(하위 포함 여부·검색 노출·만료) |
|
|
517
|
-
| `rootr_node_public_status` | 지금 공개돼 있는지, 주소는 무엇인지 |
|
|
518
|
-
| `rootr_publish_document` | 문서 전용 발행(구형 — 새로 짤 때는 `rootr_publish_node`) |
|
|
519
|
-
| `rootr_set_document_public` | 문서 전용 공개 설정 변경 |
|
|
520
|
-
| `rootr_document_public_status` | 문서 전용 공개 상태 |
|
|
521
|
-
|
|
522
|
-
#### 스프레드시트 (docs:read/docs:write)
|
|
523
|
-
|
|
524
|
-
| 도구 | 설명 |
|
|
525
|
-
|---|---|
|
|
526
|
-
| `rootr_create_spreadsheet` | 스프레드시트 만들기(시트 여러 장 가능) |
|
|
527
|
-
| `rootr_read_spreadsheet` | 시트·셀·수식 읽기 |
|
|
528
|
-
| `rootr_patch_spreadsheet_cells` | **(권장)** 셀 값·수식만 콕 집어 쓰기 |
|
|
529
|
-
| `rootr_update_spreadsheet` | 설정·아이콘 변경, 또는 시트 전체 교체(파괴적) |
|
|
530
|
-
| `rootr_create_sheet` | 시트(탭) 추가 |
|
|
531
|
-
| `rootr_update_sheet` | 시트 한 장 이름 변경·크기 조정 |
|
|
532
|
-
| `rootr_delete_sheet` | 시트(탭) 삭제 |
|
|
533
|
-
|
|
534
|
-
#### 화이트보드 (docs:read/docs:write)
|
|
535
|
-
|
|
536
|
-
| 도구 | 설명 |
|
|
537
|
-
|---|---|
|
|
538
|
-
| `rootr_create_whiteboard` | 화이트보드 만들기 |
|
|
539
|
-
| `rootr_read_whiteboard` | 도형·연결선 읽기 |
|
|
540
|
-
| `rootr_update_whiteboard` | 장면 교체 또는 병합(merge), 설정·아이콘 |
|
|
541
|
-
|
|
542
|
-
#### 녹음 · 회의록 (docs:read/docs:write)
|
|
543
|
-
|
|
544
|
-
| 도구 | 설명 |
|
|
545
|
-
|---|---|
|
|
546
|
-
| `rootr_create_recording` | 녹음 노드 만들기 |
|
|
547
|
-
| `rootr_upload_recording_audio` | 오디오 올리기(올리면 받아쓰기가 시작됩니다) |
|
|
548
|
-
| `rootr_transcribe_recording` | 받아쓰기 실행/재실행 |
|
|
549
|
-
| `rootr_read_recording` | 받아쓴 글·화자 구간 읽기 |
|
|
550
|
-
| `rootr_rename_recording_speakers` | 화자 이름 바꾸기(화자1 → 김대표) |
|
|
551
|
-
| `rootr_summarize_recording` | 요약·회의록 만들기 |
|
|
552
|
-
| `rootr_download_recording_audio` | 원본 오디오 내려받기 |
|
|
553
|
-
|
|
554
|
-
#### CRM (docs:read/docs:write)
|
|
555
|
-
|
|
556
|
-
| 도구 | 설명 |
|
|
557
|
-
|---|---|
|
|
558
|
-
| `rootr_crm_create` | CRM 노드 만들기(파이프라인·칸 정의) |
|
|
559
|
-
| `rootr_crm_get` | 파이프라인·칸·건수 보기 |
|
|
560
|
-
| `rootr_crm_update` | 파이프라인·칸·설정 수정 |
|
|
561
|
-
| `rootr_crm_list_companies` / `rootr_crm_get_company` | 회사 목록 / 상세(연락처·딜·활동·할 일) |
|
|
562
|
-
| `rootr_crm_upsert_company` | 회사 추가·수정·삭제 |
|
|
563
|
-
| `rootr_crm_list_contacts` / `rootr_crm_get_contact` | 연락처 목록 / 상세 |
|
|
564
|
-
| `rootr_crm_upsert_contact` | 연락처 추가·수정·삭제 |
|
|
565
|
-
| `rootr_crm_list_deals` / `rootr_crm_get_deal` | 딜 목록 / 상세 |
|
|
566
|
-
| `rootr_crm_upsert_deal` | 딜 추가·수정·삭제 |
|
|
567
|
-
| `rootr_crm_move_deal` | 딜을 다음 칸으로 옮기기(칸반 카드 이동) |
|
|
568
|
-
| `rootr_crm_log_activity` / `rootr_crm_list_activities` | 활동 기록 남기기 / 타임라인 조회 |
|
|
569
|
-
| `rootr_crm_upsert_task` / `rootr_crm_list_tasks` | 후속 할 일 만들기·수정 / 목록 |
|
|
570
|
-
| `rootr_crm_import` | 여러 건 한 번에 가져오기 |
|
|
571
|
-
|
|
572
|
-
#### 템플릿 (docs:read/docs:write)
|
|
573
|
-
|
|
574
|
-
| 도구 | 설명 |
|
|
575
|
-
|---|---|
|
|
576
|
-
| `rootr_list_templates` | 문서·표 템플릿 목록 |
|
|
577
|
-
| `rootr_apply_template` | 템플릿으로 노드 만들기 |
|
|
578
|
-
| `rootr_save_as_template` | 지금 노드를(또는 즉석 정의를) 템플릿으로 저장 |
|
|
579
|
-
| `rootr_update_template` | 템플릿 수정 |
|
|
580
|
-
|
|
581
|
-
#### 기억 (docs:read / docs:write)
|
|
582
|
-
|
|
583
|
-
| 도구 | 설명 |
|
|
584
|
-
|---|---|
|
|
585
|
-
| `rootr_remember` | 한 줄 사실을 기억시키기(같은 내용이면 갈아끼움). `memoryId`를 함께 주면 그 기억을 그 자리에서 고치기 |
|
|
586
|
-
| `rootr_recall` | 이 워크스페이스가 아는 것 꺼내 오기 |
|
|
587
|
-
| `rootr_forget` | 더 이상 맞지 않는 기억 폐기 |
|
|
588
|
-
|
|
589
|
-
**에이전트에게**: 이건 세션이 끝나도 남는, **워크스페이스 전체가 공유하는** 기억입니다
|
|
590
|
-
(개인 메모는 여기 두지 말고 자기 메모리에 두세요). **긴 건 문서로, 한 줄은
|
|
591
|
-
기억으로, 그리고 기억은 반드시 문서를 가리키게** 하세요 — 이야기를 기억에 밀어
|
|
592
|
-
넣으면 기억이 "짧은 문서 더미"가 되면서 둘 다 망합니다. 규칙·결정한 이유·한 번
|
|
593
|
-
겪은 함정을 남기고, 그 근거가 된 문서 경로를 `source`로 같이 주세요(그래야 그
|
|
594
|
-
문서가 바뀔 때 루터가 "확인 필요" 표시를 답니다).
|
|
595
|
-
|
|
596
|
-
기억은 워크스페이스를 처음 만질 때 **도구 응답에 자동으로 딸려옵니다** — 굳이
|
|
597
|
-
`rootr_recall`을 먼저 부르지 않아도 눈앞에 놓입니다. 이 자동 회상은 무료 조회
|
|
598
|
-
한도를 쓰지 않습니다.
|
|
599
|
-
|
|
600
|
-
사람이 직접 보고 고치려면 워크스페이스 왼쪽 메뉴의 **기억**에서 볼 수 있고,
|
|
601
|
-
"표로 열기"를 누르면 평범한 표로 열려 권한·기록이 그대로 따라옵니다.
|
|
602
|
-
|
|
603
|
-
#### 제보 (인증 불필요)
|
|
604
|
-
|
|
605
|
-
| 도구 | 설명 |
|
|
606
|
-
|---|---|
|
|
607
|
-
| `rootr_send_feedback` | 오류·불편·제안 보내기 — 키가 없거나 틀려도 들어갑니다 |
|
|
608
|
-
|
|
609
|
-
**에이전트에게**: 이 도구는 시켜야 부르는 도구가 아닙니다. 일하다가 예상 못 한
|
|
610
|
-
오류를 만나거나, 도구가 설명과 다르게 동작하거나, 우회를 하게 되거나, 사용자가
|
|
611
|
-
"이거 안 된다/헷갈린다"고 말하면 **묻지 말고 그 자리에서 한 번 보내고** 하던 일을
|
|
612
|
-
계속하세요. 도구 설명에도 같은 말이 적혀 있습니다. 같은 문제로 두 번 보내지 마세요
|
|
613
|
-
(10분 내 같은 내용은 자동으로 합쳐집니다).
|
|
614
|
-
|
|
615
|
-
#### 읽음 확인 (docs:read/docs:write)
|
|
616
|
-
|
|
617
|
-
| 도구 | 설명 |
|
|
618
|
-
|---|---|
|
|
619
|
-
| `rootr_set_read_requirement` | 이 문서를 반드시 읽게 하기(대상·기한) |
|
|
620
|
-
| `rootr_read_requirement` | 누가 읽었고 누가 안 읽었는지 |
|
|
621
|
-
| `rootr_clear_read_requirement` | 읽음 요구 해제 |
|
|
622
|
-
|
|
623
|
-
#### 서명문서 · 연구노트 (docs:read/docs:write)
|
|
624
|
-
|
|
625
|
-
| 도구 | 설명 |
|
|
626
|
-
|---|---|
|
|
627
|
-
| `rootr_create_signed_document` | 서명문서 만들기 — 본문·모드·결재라인까지 한 번에 |
|
|
628
|
-
| `rootr_read_signed_document` | 결재라인 진행·서명 목록·내 차례인지(`canSign`) |
|
|
629
|
-
| `rootr_set_approval_line` | 결재라인 다시 짜기 (올리기 전에만) |
|
|
630
|
-
| `rootr_apply_research_note_preset` | 연구노트로 전환 + 기재자→점검자 두 단계 자동 |
|
|
631
|
-
| `rootr_request_signing_code` | 확인 코드를 서명자 메일로 발송 (서명 전 필수) |
|
|
632
|
-
| `rootr_submit_signed_document` | 올리기 — 본문이 얼고 기안자가 첫 서명 |
|
|
633
|
-
| `rootr_sign_document` | 내 차례에 서명 |
|
|
634
|
-
| `rootr_reject_signed_document` | 반려 (사유 필수) |
|
|
635
|
-
| `rootr_reopen_signed_document` | 아무도 서명 안 한 초안 다시 열기 |
|
|
636
|
-
| `rootr_revise_signed_document` | 개정본 만들기 (원본은 남는다) |
|
|
637
|
-
| `rootr_verify_signed_document` | 위변조 검증 — 본문·서명·시점확인·원장 |
|
|
638
|
-
| `rootr_list_signed_documents` | 목록 (`pendingMine`: 내 차례인 것만) |
|
|
639
|
-
| `rootr_bulk_sign_documents` | 코드 하나로 최대 100건 묶음 서명 |
|
|
640
|
-
| `rootr_verify_ledger` | 워크스페이스 원장(해시 체인) 전체 재계산 |
|
|
641
|
-
|
|
642
|
-
에이전트가 대신 눌러 줄 수 없는 자리가 하나 있습니다 — **서명**. 확인 코드는
|
|
643
|
-
사람 메일로만 가므로 흐름은 항상 `rootr_request_signing_code` → 사람에게 6자리를
|
|
644
|
-
물어봄 → `rootr_sign_document` 입니다. 코드를 지어내면 403이고, 5회 틀리면 코드가
|
|
645
|
-
죽습니다.
|
|
646
|
-
|
|
647
|
-
표의 행마다 서명문서를 붙이려면 `rootr_create_database`에 `rowPageType: "SIGNED"`를
|
|
648
|
-
주세요 — 그 표는 행을 열 때마다 서명문서(연구노트)가 만들어집니다(실험 기록 대장,
|
|
649
|
-
점검 대장).
|
|
650
|
-
|
|
651
|
-
#### 문서 버전 / 삭제
|
|
652
|
-
|
|
653
|
-
| 도구 | 설명 |
|
|
654
|
-
|---|---|
|
|
655
|
-
| `rootr_document_versions` | 문서 버전 히스토리 조회 |
|
|
656
|
-
| `rootr_read_document_version` | 그 시점 본문을 그대로 읽기(되돌리기 전에 확인용) |
|
|
657
|
-
| `rootr_restore_document_version` | 문서를 예전 버전으로 되돌리기 |
|
|
658
|
-
| `rootr_update_node` | 아무 노드나 이름·아이콘 변경 / 옮기기 |
|
|
659
|
-
| `rootr_delete_node` | 노드를 휴지통으로 이동(복구 가능) |
|
|
660
|
-
|
|
661
|
-
#### 페이지 (웹페이지)
|
|
662
|
-
|
|
663
|
-
페이지(PAGE)는 **바깥 사람이 볼 화면**입니다 — 행사 안내·제품 소개·신청 받기처럼
|
|
664
|
-
링크 하나로 보여 줄 것. 전용 MCP 도구(`rootr_create_page`, `rootr_read_page`,
|
|
665
|
-
`rootr_append_page_blocks`, `rootr_update_page`, `rootr_update_page_block`,
|
|
666
|
-
`rootr_read_page_live_data`)로 저작합니다.
|
|
667
|
-
|
|
668
|
-
HTML을 짜는 것이 아니라 **정해진 블록 14종을 골라 쌓습니다** — `hero` `text`
|
|
669
|
-
`features` `gallery` `pricing` `testimonials` `faq` `timeline` `cta` `footer` +
|
|
670
|
-
표에서 값을 끌어오는 `liveStats` `liveTable` `liveChart` + 신청을 받는 `form` + 자유 블록 `custom`.
|
|
671
|
-
|
|
672
|
-
`custom`은 **격리된 방**입니다: HTML/CSS를 마음대로 쓰되 `sandbox` 아이프레임 안에서만
|
|
673
|
-
그려집니다(스크립트 없음·같은 출처 아님·바깥 통신 차단). 그래서 대담한 CSS도 바깥 화면을
|
|
674
|
-
못 덮습니다 — 저장할 때 `<script>`와 `on*=`는 지워집니다. 방 안에서는 페이지 분위기 색을
|
|
675
|
-
`var(--pg-text)` `var(--pg-card)` `var(--pg-accent)` 처럼 쓸 수 있습니다.
|
|
676
|
-
블록별 props는 **`/llms.txt`의 "Pages" 섹션**에 표로 정리돼 있습니다.
|
|
336
|
+
| Documents | 22 | list, read, write, append, edit, search, comment, version history, commits & merges, publish, trash & restore |
|
|
337
|
+
| Databases | 26 | create, columns, views, rows (single & bulk), row pages, permissions, notifications, buttons |
|
|
338
|
+
| CRM | 18 | companies, contacts, deals (incl. pipeline moves), activities, tasks, CSV import |
|
|
339
|
+
| Signed documents & research notes | 14 | create, sign, revise, reject, reopen, approval lines, signing codes, ledger verification, research-note preset |
|
|
340
|
+
| Forms | 10 | create, read, update, responses, share links, collectors |
|
|
341
|
+
| Presentations & images | 10 | decks, slides, diagram slides, image generation and background removal |
|
|
342
|
+
| Workspaces & scaffolding | 9 | list, create, delete, switch, plan / review / apply a document tree, health check |
|
|
343
|
+
| Pages | 6 | HTML page nodes: create, read, update, append and patch blocks, live data |
|
|
344
|
+
| Spreadsheets | 7 | create, read, update, per-sheet create/update/delete, patch cells & formulas |
|
|
345
|
+
| Recordings | 7 | create, upload & download audio, transcribe, summarize, rename speakers |
|
|
346
|
+
| Issue tracker | 6 | create tracker, list / create / get / update issue, comment |
|
|
347
|
+
| Permissions & visibility | 10 | grant / revoke node permissions, read access, visibility, public status, read requirements |
|
|
348
|
+
| LOG datastores | 5 | create store, update fields, add entries, query, stats |
|
|
349
|
+
| Templates | 4 | list, apply, save as template, update |
|
|
350
|
+
| Whiteboards | 3 | create, read and update the shapes & edges scene |
|
|
351
|
+
| Attachments | 2 | upload a file, attach an image straight into a document |
|
|
352
|
+
| Agent memory | 3 | remember, recall, forget |
|
|
353
|
+
| Webhooks | 3 | list, create (secret shown once), delete |
|
|
354
|
+
| Root-cause Q&A | 1 | ask the workspace knowledge graph, answer with citations |
|
|
355
|
+
| Feedback | 1 | send feedback to the Rootr team |
|
|
356
|
+
|
|
357
|
+
Guidance baked into the tool descriptions: agents should reach for `rootr_append` and
|
|
358
|
+
`rootr_edit`, and use `rootr_write` only for a genuine full rewrite (ideally with `ifMatch`).
|
|
359
|
+
Tools that take a `workspace` argument fall back to `ROOTR_WORKSPACE` / the config file, and
|
|
360
|
+
return a clear error if neither is set. Every tool description is written in English (it is the
|
|
361
|
+
schema an agent consumes), and tools that return JSON reply with pretty-printed JSON text.
|
|
362
|
+
|
|
363
|
+
Scope notes: document, database, spreadsheet, whiteboard, form, page, presentation, recording,
|
|
364
|
+
signed-document, issue, CRM and LOG tools need `docs:read` / `docs:write`; `rootr_ask` needs
|
|
365
|
+
`ask`; webhook tools need `webhooks:manage`; `rootr_create_workspace` needs an account key with
|
|
366
|
+
`workspaces:create`.
|
|
367
|
+
|
|
368
|
+
### Pages
|
|
369
|
+
|
|
370
|
+
A PAGE is **a screen for people outside the workspace** — an event announcement, a product page,
|
|
371
|
+
a sign-up. You do not write HTML: you stack **14 predefined block types** — `hero`, `text`,
|
|
372
|
+
`features`, `gallery`, `pricing`, `testimonials`, `faq`, `timeline`, `cta`, `footer`, the
|
|
373
|
+
table-backed `liveStats`, `liveTable`, `liveChart`, the `form` block, and the free-form `custom`.
|
|
374
|
+
|
|
375
|
+
`custom` is an **isolated room**: write any HTML/CSS you like, but it renders inside a `sandbox`
|
|
376
|
+
iframe (no scripts, not same-origin, no outbound calls), so even bold CSS cannot leak onto the
|
|
377
|
+
rest of the page. `<script>` and `on*=` attributes are stripped on save. Inside the room you can
|
|
378
|
+
use the page's palette through `var(--pg-text)`, `var(--pg-card)`, `var(--pg-accent)`.
|
|
379
|
+
Per-block props are tabulated in the **"Pages" section of [`/llms.txt`](https://rootr.io/llms.txt)**.
|
|
677
380
|
|
|
678
381
|
```bash
|
|
679
|
-
#
|
|
382
|
+
# create a page (omit blocks to start from a hero/text/footer skeleton)
|
|
680
383
|
curl -X POST "$BASE/workspaces/$WS/pages" -H "x-api-key: $KEY" \
|
|
681
384
|
-H 'Content-Type: application/json' \
|
|
682
|
-
-d '{"name":"
|
|
683
|
-
"blocks":[{"type":"hero","props":{"title":"
|
|
385
|
+
-d '{"name":"Autumn meetup","config":{"theme":"midnight"},
|
|
386
|
+
"blocks":[{"type":"hero","props":{"title":"Autumn Developer Meetup","subtitle":"Oct 12 · Seoul"}}]}'
|
|
684
387
|
|
|
685
|
-
#
|
|
686
|
-
curl -X POST "$BASE/pages/$ID/blocks" -d '{"blocks":[{"type":"faq","props":{"items":[
|
|
388
|
+
# append blocks (existing ones untouched) / replace config / read live values
|
|
389
|
+
curl -X POST "$BASE/pages/$ID/blocks" -d '{"blocks":[{"type":"faq","props":{"items":[]}}]}' ...
|
|
687
390
|
curl -X PATCH "$BASE/pages/$ID" -d '{"config":{"theme":"warm"}}' ...
|
|
688
|
-
curl
|
|
391
|
+
curl "$BASE/pages/$ID/live-data" -H "x-api-key: $KEY"
|
|
689
392
|
```
|
|
690
393
|
|
|
691
|
-
`liveStats
|
|
692
|
-
|
|
693
|
-
`
|
|
694
|
-
|
|
695
|
-
|
|
394
|
+
For `liveStats` / `liveTable` / `liveChart`, `source.nodeId` is a DATABASE or LOG node in the
|
|
395
|
+
same workspace and columns are referenced **by name** (not by column id). Point a `form` block's
|
|
396
|
+
`formNodeId` at a form node and visitors submit **right there** — the form does not have to be
|
|
397
|
+
published separately. Tables and forms that live under a PRIVATE subtree are silently dropped
|
|
398
|
+
from a public page, on purpose.
|
|
696
399
|
|
|
697
|
-
|
|
400
|
+
Publishing works like any other node: `POST /v1/nodes/:id/publish` → `rootr.io/p/{slug}`.
|
|
698
401
|
|
|
699
|
-
|
|
402
|
+
### Presentations
|
|
700
403
|
|
|
701
|
-
|
|
702
|
-
`
|
|
703
|
-
`
|
|
704
|
-
`
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
호출**해도 됩니다 (`x-api-key` 헤더, `docs:write`):
|
|
404
|
+
Decks are authored with `rootr_create_presentation`, `rootr_read_presentation`,
|
|
405
|
+
`rootr_append_presentation_slides`, `rootr_update_presentation_slide`,
|
|
406
|
+
`rootr_reorder_presentation_slides` and `rootr_update_presentation`. Artwork can be produced with
|
|
407
|
+
`rootr_generate_image` (image from a sentence) and `rootr_remove_image_background` — both spend
|
|
408
|
+
AI credits. The same thing works over plain REST with the same API key (`x-api-key`,
|
|
409
|
+
`docs:write`):
|
|
708
410
|
|
|
709
411
|
```bash
|
|
710
|
-
#
|
|
412
|
+
# create a deck (slides optional)
|
|
711
413
|
curl -X POST "$BASE/workspaces/$WS/presentations" -H "x-api-key: $KEY" \
|
|
712
414
|
-H 'Content-Type: application/json' \
|
|
713
|
-
-d '{"name":"
|
|
415
|
+
-d '{"name":"Proposal","slides":[{"id":"SLD-001","kind":"cover","title":"..."}]}'
|
|
714
416
|
|
|
715
|
-
#
|
|
417
|
+
# patch one slide (merge) / append / reorder
|
|
716
418
|
curl -X PATCH "$BASE/presentations/$ID/slides/SLD-001" -H "x-api-key: $KEY" \
|
|
717
|
-
-H 'Content-Type: application/json' -d '{"slide":{"notes":"
|
|
718
|
-
curl -X POST "$BASE/presentations/$ID/slides" -d '{"slides":[
|
|
419
|
+
-H 'Content-Type: application/json' -d '{"slide":{"notes":"speaker notes"}}'
|
|
420
|
+
curl -X POST "$BASE/presentations/$ID/slides" -d '{"slides":[]}' ...
|
|
719
421
|
curl -X POST "$BASE/presentations/$ID/reorder" -d '{"order":["SLD-002","SLD-001"]}' ...
|
|
720
422
|
```
|
|
721
423
|
|
|
722
|
-
|
|
424
|
+
#### Diagrams on a slide
|
|
723
425
|
|
|
724
|
-
|
|
725
|
-
`rootr_create_diagram_slide
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
이 도구를 쓰는 것이 유일한 방법입니다.
|
|
426
|
+
For architecture, workflow, sequence, dataflow and lifecycle diagrams, do not hand-write SVG.
|
|
427
|
+
Pass a **typed JSON spec** to `rootr_create_diagram_slide`; the server validates it, renders it,
|
|
428
|
+
and drops it onto the slide — it survives PDF and PPTX export too. A slide's `diagram` (mermaid)
|
|
429
|
+
field is **not rendered by the viewer**, so this tool is the only way.
|
|
729
430
|
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
431
|
+
Each type has its own spec shape, so **fetch the schema and an example first with
|
|
432
|
+
`rootr_diagram_schema`**. A spec that does not fit is rejected with which field is wrong and how
|
|
433
|
+
to fix it, so you can correct it and call again.
|
|
733
434
|
|
|
734
435
|
```bash
|
|
735
|
-
#
|
|
436
|
+
# see the spec shape (architecture | workflow | sequence | dataflow | lifecycle)
|
|
736
437
|
curl "$BASE/diagram-types/workflow/schema" -H "x-api-key: $KEY"
|
|
737
438
|
|
|
738
|
-
#
|
|
439
|
+
# render it onto a slide (pass slideId to redraw an existing slide)
|
|
739
440
|
curl -X POST "$BASE/presentations/$ID/diagram-slides" -H "x-api-key: $KEY" \
|
|
740
441
|
-H 'Content-Type: application/json' \
|
|
741
|
-
-d '{"type":"workflow","spec":{
|
|
742
|
-
"blocks":[{"heading":"
|
|
442
|
+
-d '{"type":"workflow","spec":{},"title":"An issue reaches main only through review",
|
|
443
|
+
"blocks":[{"heading":"Review is the gate","body":"..."}]}'
|
|
743
444
|
```
|
|
744
445
|
|
|
745
|
-
`quality
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
**고품질 덱을 만들 때는 슬라이드 `html` 필드에 1280×720 완결 HTML을 직접 구워
|
|
750
|
-
넣는 방식을 권장**합니다 — 뷰어가 기본 템플릿 대신 그대로 렌더합니다(완전 자유
|
|
751
|
-
디자인). 필수 규칙(외부 요청 차단이라 전부 인라인, 이미지=data URI 내장, 폰트
|
|
752
|
-
폴백 스택, `<span class="pn">`=페이지번호, 그래프용 텍스트(title/blocks/notes/alt)
|
|
753
|
-
병행 유지)은 **`/llms.txt`의 "Presentations" 섹션**에 정리돼 있습니다 — 저작 전에
|
|
754
|
-
꼭 읽어보세요. AI 이미지 생성은 `POST /v1/workspaces/:ws/images/generate`(AI
|
|
755
|
-
크레딧 차감)를 사용합니다.
|
|
756
|
-
|
|
757
|
-
모든 도구 설명은 영어(에이전트가 소비하는 스키마)로 작성되어 있고, JSON을 반환하는
|
|
758
|
-
도구는 보기 좋게 들여쓴 JSON 텍스트로 응답합니다. `workspace` 인자를 받는 도구는
|
|
759
|
-
생략 시 `ROOTR_WORKSPACE`/설정파일의 기본 워크스페이스를 사용하며, 그것도 없으면
|
|
760
|
-
명확한 에러를 반환합니다.
|
|
446
|
+
`quality` defaults to `standard`; `showcase` applies the stricter bar meant for hand-tuned hero
|
|
447
|
+
diagrams and will reject specs that `standard` accepts. Text inside a rendered diagram does not
|
|
448
|
+
reach the knowledge graph, so keep the facts in `title`, `blocks` and `notes` as well.
|
|
761
449
|
|
|
762
|
-
|
|
450
|
+
**For high-quality decks, bake self-contained 1280×720 HTML into the slide's `html` field** — the
|
|
451
|
+
viewer renders it verbatim instead of the default template, giving you a completely free design.
|
|
452
|
+
The rules (inline everything because outbound requests are blocked, images as data URIs, a font
|
|
453
|
+
fallback stack, `<span class="pn">` for page numbers, and keeping the text fields filled so the
|
|
454
|
+
deck still feeds the knowledge graph) are documented in the **"Presentations" section of
|
|
455
|
+
[`/llms.txt`](https://rootr.io/llms.txt)** — read it before authoring. AI image generation uses
|
|
456
|
+
`POST /v1/workspaces/:ws/images/generate` and spends AI credits.
|
|
763
457
|
|
|
764
|
-
|
|
458
|
+
### Register with Claude Code / Claude Desktop
|
|
765
459
|
|
|
766
460
|
```json
|
|
767
461
|
{
|
|
768
462
|
"mcpServers": {
|
|
769
463
|
"rootr": {
|
|
770
|
-
"command": "
|
|
771
|
-
"args": ["
|
|
464
|
+
"command": "npx",
|
|
465
|
+
"args": ["-y", "rootr-cli", "mcp"],
|
|
772
466
|
"env": {
|
|
773
467
|
"ROOTR_API_KEY": "rootr_xxxxxxxxxxxxxxxx",
|
|
774
468
|
"ROOTR_WORKSPACE": "ws_123"
|
|
@@ -778,34 +472,48 @@ curl -X POST "$BASE/presentations/$ID/diagram-slides" -H "x-api-key: $KEY" \
|
|
|
778
472
|
}
|
|
779
473
|
```
|
|
780
474
|
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
- `401
|
|
789
|
-
- `412`
|
|
790
|
-
- `409`
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
475
|
+
With a global install, use `"command": "rootr"` and `"args": ["mcp"]`. From a clone, point
|
|
476
|
+
`command` at `node` and `args` at `["/path/to/rootr-cli/bin/rootr.js", "mcp"]`.
|
|
477
|
+
|
|
478
|
+
## Errors
|
|
479
|
+
|
|
480
|
+
On a non-2xx response the CLI prints the API's `message` to stderr and exits 1, with hints:
|
|
481
|
+
|
|
482
|
+
- `401` / `403` — check the API key and workspace scopes
|
|
483
|
+
- `412` — document changed since you read it; read again and retry (If-Match mismatch)
|
|
484
|
+
- `409` — the server's reason is shown verbatim (e.g. `edit` found no unique match)
|
|
485
|
+
- `429` — usage limit reached; the message carries the reset time and an upgrade link
|
|
486
|
+
|
|
487
|
+
## Development
|
|
488
|
+
|
|
489
|
+
- Dependencies: `@modelcontextprotocol/sdk` (MCP server) and `zod` (tool input schemas). The CLI
|
|
490
|
+
itself (`bin/rootr.js`, `lib/config.js`, `lib/client.js`, `lib/resolve.js`) has none.
|
|
491
|
+
- No build step — plain ESM JavaScript.
|
|
492
|
+
|
|
493
|
+
```
|
|
494
|
+
bin/rootr.js entry point, command dispatch
|
|
495
|
+
lib/config.js config load/save
|
|
496
|
+
lib/credentials.js API key / workspace resolution
|
|
497
|
+
lib/context.js per-call request context
|
|
498
|
+
lib/client.js Rootr REST client
|
|
499
|
+
lib/resolve.js path/id target resolution
|
|
500
|
+
lib/mcp.js MCP stdio server, assembles the tool modules
|
|
501
|
+
lib/mcp-tools/*.js one module per tool group (shared, documents, pages, workspaces,
|
|
502
|
+
databases, spreadsheets, whiteboards, forms, presentations,
|
|
503
|
+
recordings, signed, templates, attachments, public, memory,
|
|
504
|
+
logs, issues, crm, webhooks, ask, feedback, misc)
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
Smoke-test the MCP server without any credentials — it must start and list its tools:
|
|
508
|
+
|
|
509
|
+
```bash
|
|
510
|
+
printf '%s\n' \
|
|
511
|
+
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
|
|
512
|
+
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
|
|
513
|
+
'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
|
|
514
|
+
| node bin/rootr.js mcp
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
## License
|
|
518
|
+
|
|
519
|
+
MIT — see [`LICENSE`](LICENSE).
|