rootr-cli 0.17.0 → 0.17.2
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 +827 -0
- package/README.md +373 -651
- package/bin/rootr.js +480 -299
- package/lib/client.js +45 -21
- package/lib/credentials.js +41 -16
- package/lib/i18n.js +40 -0
- package/lib/mcp-tools/memory.js +25 -5
- package/lib/mcp.js +23 -11
- package/lib/resolve.js +25 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,774 +1,482 @@
|
|
|
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
25
|
|
|
26
|
-
|
|
27
|
-
cd cli
|
|
28
|
-
npm install
|
|
26
|
+
## Two ways to connect
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
node bin/rootr.js --help
|
|
28
|
+
**1. Remote connector — nothing to install.** Rootr hosts an MCP endpoint with OAuth:
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
rootr --help
|
|
30
|
+
```
|
|
31
|
+
https://rootr.io/mcp
|
|
36
32
|
```
|
|
37
33
|
|
|
38
|
-
|
|
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.
|
|
39
36
|
|
|
40
|
-
|
|
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.
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
| `ROOTR_BASE_URL` | `baseUrl` | 기본값 `https://rootr.io/api/v1` |
|
|
40
|
+
```bash
|
|
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
|
+
```
|
|
47
44
|
|
|
48
|
-
|
|
45
|
+
Or from a clone:
|
|
49
46
|
|
|
50
47
|
```bash
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
rootr config --api-key rootr_xxx --workspace ws_123 --base-url https://dev.rootr.io/api/v1
|
|
48
|
+
npm install
|
|
49
|
+
node bin/rootr.js --help
|
|
54
50
|
```
|
|
55
51
|
|
|
56
|
-
|
|
52
|
+
Docker:
|
|
57
53
|
|
|
58
|
-
|
|
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
|
|
57
|
+
```
|
|
59
58
|
|
|
60
|
-
|
|
59
|
+
## Configuration
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
Precedence: **environment variables > `~/.rootr/config.json`**
|
|
62
|
+
|
|
63
|
+
| Env var | Config key | Description |
|
|
64
|
+
|---|---|---|
|
|
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` |
|
|
68
|
+
| `ROOTR_LANG` | — | `en` or `ko`. Without it the CLI follows your locale (`LC_ALL`/`LC_MESSAGES`/`LANG`): Korean if that starts with `ko`, English otherwise |
|
|
68
69
|
|
|
69
|
-
|
|
70
|
+
Save them to the config file:
|
|
70
71
|
|
|
71
72
|
```bash
|
|
72
|
-
rootr config
|
|
73
|
-
#
|
|
74
|
-
|
|
75
|
-
# workspace: ws_123
|
|
76
|
-
# baseUrl: https://rootr.io/api/v1
|
|
73
|
+
rootr config --api-key rootr_xxxxxxxxxxxxxxxx --workspace ws_123
|
|
74
|
+
# self-hosted or dev server
|
|
75
|
+
rootr config --api-key rootr_xxx --workspace ws_123 --base-url https://dev.rootr.io/api/v1
|
|
77
76
|
```
|
|
78
77
|
|
|
79
|
-
|
|
78
|
+
`~/.rootr/config.json` is written with mode `600`.
|
|
80
79
|
|
|
81
|
-
|
|
82
|
-
(워크스페이스 설정 필요). `/`로 시작하지 않으면 **노드 id**로 취급합니다.
|
|
80
|
+
### Language
|
|
83
81
|
|
|
84
|
-
|
|
82
|
+
Help, messages and errors come out in English by default, and in Korean when your locale says Korean.
|
|
83
|
+
Force it either way with `ROOTR_LANG`:
|
|
85
84
|
|
|
86
85
|
```bash
|
|
87
|
-
rootr
|
|
88
|
-
rootr
|
|
86
|
+
ROOTR_LANG=ko rootr --help # Korean
|
|
87
|
+
ROOTR_LANG=en rootr --help # English
|
|
89
88
|
```
|
|
90
89
|
|
|
91
|
-
|
|
90
|
+
The MCP server reads the same variable, so a client that spawns `rootr mcp` can set it in `env`.
|
|
91
|
+
Tool descriptions are English either way — that is the schema an agent consumes.
|
|
92
92
|
|
|
93
|
-
###
|
|
93
|
+
### Two kinds of key
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
- **Workspace key** — scoped to one workspace. Scopes: `docs:read`, `docs:write`, `graph:read`,
|
|
96
|
+
`ask`, `webhooks:manage`. Enough for almost every tool.
|
|
97
|
+
- **Account key (PAT)** — acts for the whole account. With the `workspaces:create` scope it can
|
|
98
|
+
create new workspaces (`rootr_create_workspace`). Trying that with a workspace key returns 403
|
|
99
|
+
with a hint saying an account key is required.
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
Show the current configuration (only the first 12 characters of the key are printed):
|
|
102
102
|
|
|
103
103
|
```bash
|
|
104
|
-
|
|
105
|
-
rootr write /notes/new.md --file ./local.md
|
|
106
|
-
rootr write <nodeId> --file ./local.md --if-match "\"abc123\"" # 낙관적 동시성 제어
|
|
104
|
+
rootr config
|
|
107
105
|
```
|
|
108
106
|
|
|
109
|
-
|
|
110
|
-
`--if-match`를 지정했는데 그 사이 문서가 바뀌었으면 412 오류와 함께
|
|
111
|
-
"문서가 그 사이 변경됨: 다시 읽고 재시도" 힌트가 출력됩니다.
|
|
107
|
+
### Working with several workspaces
|
|
112
108
|
|
|
113
|
-
|
|
109
|
+
Register each workspace's key once:
|
|
114
110
|
|
|
115
111
|
```bash
|
|
116
|
-
rootr
|
|
117
|
-
rootr
|
|
118
|
-
cat diff.md | rootr append /notes/log.md
|
|
119
|
-
rootr append /notes/log.md --file ./chunk.md
|
|
112
|
+
rootr config --add-key rootr_xxx --label "Sales"
|
|
113
|
+
rootr config # list registered keys
|
|
120
114
|
```
|
|
121
115
|
|
|
122
|
-
|
|
123
|
-
|
|
116
|
+
After that, `rootr use` (and the `rootr_use_workspace` MCP tool) accepts a **name, an id, or a
|
|
117
|
+
rootr.io URL**; the key that opens that workspace is selected and remembered automatically. An
|
|
118
|
+
account key (PAT) switches to any workspace you belong to.
|
|
124
119
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
rootr edit /notes/todo.md --find "- [ ] 배포" --replace "- [x] 배포"
|
|
129
|
-
rootr edit /notes/todo.md --find "TODO" --replace "DONE" --all
|
|
130
|
-
```
|
|
120
|
+
A workspace key does not open anything outside its own workspace. Because of that, `rootr ws`
|
|
121
|
+
marks entries your registered keys cannot open — **being listed and being reachable are not the
|
|
122
|
+
same thing**.
|
|
131
123
|
|
|
132
|
-
|
|
133
|
-
|
|
124
|
+
Web URLs (`https://rootr.io/en/w/<ws>/d/<doc>`) can be pasted directly into any node argument.
|
|
125
|
+
If the URL belongs to another workspace, the error tells you to switch first.
|
|
134
126
|
|
|
135
|
-
|
|
127
|
+
> The remote connector (`https://rootr.io/mcp`) is bound to the single workspace you picked when
|
|
128
|
+
> you authorized it. For another workspace, issue a new connector for that workspace.
|
|
136
129
|
|
|
137
|
-
|
|
138
|
-
rootr search "배포 절차"
|
|
139
|
-
```
|
|
130
|
+
## CLI
|
|
140
131
|
|
|
141
|
-
|
|
132
|
+
Path arguments starting with `/` are resolved as **paths** through the by-path API (needs a
|
|
133
|
+
workspace). Anything else is treated as a **node id**.
|
|
142
134
|
|
|
143
|
-
###
|
|
135
|
+
### Documents
|
|
144
136
|
|
|
145
137
|
```bash
|
|
146
|
-
rootr
|
|
147
|
-
rootr
|
|
148
|
-
```
|
|
138
|
+
rootr ls # whole tree, TYPE<TAB>path
|
|
139
|
+
rootr ls /notes # one subtree
|
|
149
140
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
**경로가 아니라 id** 입니다(휴지통에 든 것은 이미 트리에 없어 경로로는 못 찾습니다).
|
|
153
|
-
`rootr rm` 이 마지막 줄에 그 id 를 찍어 주니 그대로 쓰면 됩니다. MCP 로는
|
|
154
|
-
`rootr_restore_node`. `--yes` 없이 실행하면 확인을 묻습니다
|
|
155
|
-
(파이프/CI처럼 입력이 없는 환경에서는 "아니오"로 처리되어 안전합니다).
|
|
156
|
-
`docs:write` 스코프가 필요합니다.
|
|
141
|
+
rootr read /notes/todo.md # markdown to stdout
|
|
142
|
+
rootr read /notes/todo.md --json # full JSON with metadata
|
|
157
143
|
|
|
158
|
-
|
|
144
|
+
echo "# Title" | rootr write /notes/new.md
|
|
145
|
+
rootr write /notes/new.md --file ./local.md
|
|
146
|
+
rootr write <nodeId> --file ./local.md --if-match '"abc123"' # optimistic concurrency
|
|
159
147
|
|
|
160
|
-
|
|
161
|
-
rootr
|
|
162
|
-
|
|
148
|
+
rootr append /notes/log.md "deploy finished"
|
|
149
|
+
rootr append /notes/log.md "- one more item" --heading "## Todo"
|
|
150
|
+
cat diff.md | rootr append /notes/log.md
|
|
151
|
+
|
|
152
|
+
rootr edit /notes/todo.md --find "- [ ] deploy" --replace "- [x] deploy"
|
|
153
|
+
rootr edit /notes/todo.md --find "TODO" --replace "DONE" --all
|
|
154
|
+
|
|
155
|
+
rootr comments /notes/spec.md # comments, including ones left on the public page
|
|
156
|
+
rootr search "deployment runbook"
|
|
157
|
+
rootr mv /notes/old.md /archive/old.md # move and/or rename
|
|
158
|
+
rootr rm /notes/old.md --yes # to the trash, recoverable
|
|
159
|
+
rootr restore <id> # undo a delete (id, not path)
|
|
160
|
+
rootr attach ./diagram.png --doc /notes/spec.md --heading "## Design"
|
|
163
161
|
```
|
|
164
162
|
|
|
165
|
-
`
|
|
166
|
-
|
|
167
|
-
것과 접근되는 것은 다릅니다. `rootr use`는 그 워크스페이스를 여는 키를 골라 함께 기억합니다.
|
|
163
|
+
`append` never rewrites the whole document, so concurrent writers cannot clobber each other —
|
|
164
|
+
prefer it over `write`. `--heading` appends to the end of that heading's section.
|
|
168
165
|
|
|
169
|
-
|
|
166
|
+
`edit` returns 409 if the `--find` text is missing or not unique; the server's reason is printed
|
|
167
|
+
as-is. `write --if-match` returns 412 if the document changed in the meantime.
|
|
170
168
|
|
|
171
|
-
|
|
169
|
+
### Workspaces and questions
|
|
172
170
|
|
|
173
171
|
```bash
|
|
174
|
-
rootr
|
|
175
|
-
rootr
|
|
172
|
+
rootr ws # id<TAB>name
|
|
173
|
+
rootr use "Sales" # switch — id, name, or rootr.io URL
|
|
174
|
+
rootr ask "why did latency go up after last week's deploy?"
|
|
175
|
+
rootr ask "why did payment failures rise?" --workspace ws_123
|
|
176
176
|
```
|
|
177
177
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
키(PAT)를 쓰면 소속된 어느 워크스페이스로든 바로 전환됩니다.
|
|
178
|
+
`ask` queries the workspace knowledge graph (GraphRAG) and prints the answer plus citations in
|
|
179
|
+
`document path: quote` form. Requires the `ask` scope.
|
|
181
180
|
|
|
182
|
-
|
|
183
|
-
목록에 보여도 접근은 안 되는 경우가 있어, 등록된 키가 워크스페이스 키뿐이면 목록에
|
|
184
|
-
`[등록된 키로는 접근 불가]`를 함께 표시합니다.
|
|
181
|
+
### Databases
|
|
185
182
|
|
|
186
|
-
|
|
187
|
-
|
|
183
|
+
```bash
|
|
184
|
+
rootr db create --file spec.json --parent /projects # columns in the given order, rows included
|
|
185
|
+
rootr db rows /projects/tasks --body --backlinks # rows, with row bodies and inbound links
|
|
186
|
+
rootr db row-add /projects/tasks --values '{"Title":"Ship v2","Status":"Doing"}'
|
|
187
|
+
rootr db rows-new /projects/tasks --file rows.json # many at once — all or nothing
|
|
188
|
+
rootr db rows-set /projects/tasks --ids r1,r2 --values '{"Status":"Done"}'
|
|
189
|
+
rootr db rows-each /projects/tasks --json '[{"rowId":"r1","values":{"Score":3}}]'
|
|
190
|
+
rootr db rows-rm /projects/tasks --ids r1,r2 --yes
|
|
191
|
+
rootr db view /projects/tasks Calendar --scale month # views: table, board, calendar, timeline
|
|
192
|
+
rootr db lock /projects/tasks --schema managers --rows own --locked "Approved,Score"
|
|
193
|
+
rootr db notify /projects/tasks --file rules.json # notification rules
|
|
194
|
+
rootr db buttons /projects/tasks --file buttons.json # buttons that do work when pressed
|
|
195
|
+
rootr db button-run /projects/tasks fill-summary --rows r1,r2
|
|
196
|
+
rootr db row-page <rowId> --type RECORDING # give one row a typed detail page
|
|
197
|
+
```
|
|
188
198
|
|
|
189
|
-
|
|
190
|
-
|
|
199
|
+
### Forms
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
rootr form new /intake/request --collect db \
|
|
203
|
+
--fields '[{"name":"Email","type":"email","required":true},{"name":"How urgent?","type":"scale"}]'
|
|
204
|
+
rootr form show /intake/request # read the questions before changing them
|
|
205
|
+
rootr form set /intake/request --fields '[...]' # replaces the question set
|
|
206
|
+
rootr form collect /intake/request --to sheet # create and wire a destination
|
|
207
|
+
rootr form responses /intake/request --latest # --latest = newest one per person
|
|
208
|
+
rootr form response-edit <responseId> --values '{"Email":"a@b.com"}'
|
|
209
|
+
```
|
|
191
210
|
|
|
192
|
-
|
|
211
|
+
`--fields` takes a JSON array as a **string**, not a file path.
|
|
193
212
|
|
|
194
|
-
|
|
195
|
-
|
|
213
|
+
18 question types, including `text`, `email`, `phone`, `url`, `rating`, `scale`, `time`, `file`,
|
|
214
|
+
`matrix`, `ranking`, `csat` and `nps`. `--collect db|sheet` creates the destination and wires it
|
|
215
|
+
up, mapping questions to columns.
|
|
196
216
|
|
|
197
|
-
|
|
198
|
-
| --- | --- |
|
|
199
|
-
| Free | **하루 180회** (KST 자정 리셋) |
|
|
200
|
-
| Team | 시간당 5,000회 |
|
|
201
|
-
| Business | 시간당 50,000회 |
|
|
202
|
-
| Platform | 무제한 |
|
|
217
|
+
### Publishing and access
|
|
203
218
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
219
|
+
```bash
|
|
220
|
+
rootr publish /handbook --children # works for every node type
|
|
221
|
+
rootr publish /handbook --status # is it public, at what URL, children included?
|
|
222
|
+
rootr publish /projects/tasks --layout board --skin paper # 9 layouts × 6 skins
|
|
223
|
+
rootr publish /handbook/policy.md --comments --expires 2026-12-31T00:00:00Z
|
|
224
|
+
rootr publish /handbook --off
|
|
225
|
+
|
|
226
|
+
rootr access /handbook --private # or --public / --inherit
|
|
227
|
+
rootr access /handbook --grant <userId> --level WRITE
|
|
228
|
+
rootr access /handbook --revoke <userId>
|
|
229
|
+
|
|
230
|
+
rootr readreq /handbook/policy.md --users u1,u2 --due 2026-10-01T00:00:00Z --ack
|
|
231
|
+
rootr readreq /handbook/policy.md # who has read it, completion rate
|
|
232
|
+
```
|
|
207
233
|
|
|
208
|
-
###
|
|
234
|
+
### Signed documents and research notes
|
|
209
235
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
236
|
+
A signed document is a markdown document whose body **freezes the moment it is submitted**; the
|
|
237
|
+
people on the approval line then sign in order. Every signature carries a trusted timestamp (TSA)
|
|
238
|
+
and hash chaining, so tampering is provable, and signed documents are never deleted (30-year
|
|
239
|
+
retention). Corporate approval flows and national R&D electronic research notes are the same
|
|
240
|
+
feature.
|
|
214
241
|
|
|
215
242
|
```bash
|
|
216
|
-
#
|
|
217
|
-
rootr sign new "
|
|
243
|
+
# create — body and approval line in one step; a research note only needs a reviewer
|
|
244
|
+
rootr sign new "/notes/2026-08-25 experiment" --file note.md --reviewer <reviewer userId>
|
|
218
245
|
|
|
219
|
-
#
|
|
246
|
+
# build the approval line by hand (array order = signing order)
|
|
220
247
|
cat > line.json <<'EOF'
|
|
221
|
-
[ { "label": "
|
|
222
|
-
{ "label": "
|
|
248
|
+
[ { "label": "Author", "members": [{ "userId": "u1", "role": "AUTHOR" }] },
|
|
249
|
+
{ "label": "Manager", "rule": "ANY", "members": [{ "userId": "u2" }, { "userId": "u3" }] } ]
|
|
223
250
|
EOF
|
|
224
|
-
rootr sign line
|
|
251
|
+
rootr sign line "/notes/2026-08-25 experiment" --file line.json
|
|
225
252
|
|
|
226
|
-
#
|
|
227
|
-
rootr sign code
|
|
228
|
-
rootr sign submit
|
|
253
|
+
# submit: request a confirmation code by email, then pass those 6 digits
|
|
254
|
+
rootr sign code "/notes/2026-08-25 experiment"
|
|
255
|
+
rootr sign submit "/notes/2026-08-25 experiment" --code 123456
|
|
229
256
|
|
|
230
|
-
#
|
|
257
|
+
# next signer: see only what is waiting on you, then sign (or reject with a reason)
|
|
231
258
|
rootr sign list --pending
|
|
232
259
|
rootr sign code <id> && rootr sign approve <id> --code 123456
|
|
233
|
-
rootr sign reject <id> --comment "
|
|
260
|
+
rootr sign reject <id> --comment "supporting data is missing" --code 123456
|
|
234
261
|
|
|
235
|
-
#
|
|
262
|
+
# many at once (up to 100 with a single code)
|
|
236
263
|
rootr sign code --bulk
|
|
237
264
|
rootr sign bulk <id1> <id2> <id3> --code 123456
|
|
238
265
|
|
|
239
|
-
#
|
|
240
|
-
rootr sign verify <id> #
|
|
241
|
-
rootr sign ledger #
|
|
266
|
+
# proof
|
|
267
|
+
rootr sign verify <id> # body, signatures, timestamps and ledger intact?
|
|
268
|
+
rootr sign ledger # recompute the whole workspace ledger
|
|
242
269
|
```
|
|
243
270
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
10
|
|
271
|
+
**The CLI cannot mint the confirmation code for you.** It is emailed to the signer only. In a
|
|
272
|
+
design where the server holds the private key, that code is the single piece of evidence that a
|
|
273
|
+
human pressed the button. It is valid for 10 minutes, dies after 5 wrong attempts, and a repeat
|
|
274
|
+
request within 30 seconds is refused.
|
|
247
275
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
요구하기 때문입니다.
|
|
276
|
+
Approval-line members are `{"userId"}` or `{"email","displayName"}` — with an email address a
|
|
277
|
+
person can sign without a Rootr account.
|
|
251
278
|
|
|
252
|
-
|
|
279
|
+
A signed document is never edited in place. You issue a **revision**
|
|
280
|
+
(`rootr sign revise <id> --note "…"`) and the original stays as `SUPERSEDED`, because the
|
|
281
|
+
regulations require both the original and the trace of the change to remain visible.
|
|
282
|
+
|
|
283
|
+
### Team memory
|
|
253
284
|
|
|
254
285
|
```bash
|
|
255
|
-
rootr
|
|
256
|
-
rootr
|
|
257
|
-
|
|
286
|
+
rootr memory # recall everything
|
|
287
|
+
rootr memory --query seminar --kind 지시 # filtered
|
|
288
|
+
rootr memory add "Report times in KST only" --kind 지시 --source /rules.md
|
|
289
|
+
rootr memory edit <id> --content "corrected sentence" # only the fields you pass change
|
|
290
|
+
rootr memory forget <id> # retire (--hard deletes the row)
|
|
258
291
|
```
|
|
259
292
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
293
|
+
`--kind` is one of four literal values: `지시` (how the team wants work done), `사람` (someone's
|
|
294
|
+
role or preference), `프로젝트` (an ongoing effort), `참고` (a reference). The same four values
|
|
295
|
+
are the enum on the `rootr_remember` / `rootr_recall` MCP tools.
|
|
263
296
|
|
|
264
|
-
|
|
265
|
-
`
|
|
266
|
-
|
|
297
|
+
One-line facts that outlive a session and are shared by the whole workspace. This is the same
|
|
298
|
+
data as the `rootr_remember` / `rootr_recall` / `rootr_forget` MCP tools and the "Memory" menu in
|
|
299
|
+
the app. **Long things belong in a document; one-liners belong in memory.**
|
|
267
300
|
|
|
268
|
-
|
|
269
|
-
안에서 반복 호출해도 목록이 더러워지지 않습니다.
|
|
270
|
-
|
|
271
|
-
### RCA 질의응답 (ask)
|
|
301
|
+
### Scaffolding a workspace
|
|
272
302
|
|
|
273
303
|
```bash
|
|
274
|
-
rootr
|
|
275
|
-
rootr
|
|
304
|
+
rootr scaffold plan "a workspace for running a hardware startup's QA process"
|
|
305
|
+
rootr scaffold review --file tree.json # get graded before anything is created
|
|
306
|
+
rootr scaffold apply --file tree.json --root /qa
|
|
307
|
+
rootr scaffold built --root /qa # inspect the shape of what was created
|
|
308
|
+
rootr scaffold test --root /qa # actually exercise relations, rollups, formulas, forms
|
|
276
309
|
```
|
|
277
310
|
|
|
278
|
-
|
|
279
|
-
`ask` 스코프가 필요합니다. `--workspace`를 생략하면 설정된 기본 워크스페이스를 사용합니다.
|
|
280
|
-
|
|
281
|
-
### 팀의 기억 (memory)
|
|
311
|
+
### Reporting a problem
|
|
282
312
|
|
|
283
313
|
```bash
|
|
284
|
-
rootr
|
|
285
|
-
rootr
|
|
286
|
-
|
|
287
|
-
rootr memory edit <id> --content "고친 문장" # 그 기억만 고치기(준 칸만 바뀜)
|
|
288
|
-
rootr memory edit <id> --kind 참고 # 종류만 고치기
|
|
289
|
-
rootr memory forget <id> # 폐기(--hard면 행 삭제)
|
|
314
|
+
rootr feedback "rootr_add_row could not find my column by name; column ids worked." --kind friction
|
|
315
|
+
rootr feedback --file report.md --kind bug --email me@example.com
|
|
316
|
+
cat error.log | rootr feedback --kind bug
|
|
290
317
|
```
|
|
291
318
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
기억으로** — 자세한 규칙은 MCP 도구 설명을 참고하세요.
|
|
296
|
-
|
|
297
|
-
## MCP 서버로 사용하기
|
|
298
|
-
|
|
299
|
-
`rootr mcp`는 stdio로 MCP(Model Context Protocol) 서버를 구동합니다. 제공 도구 152종:
|
|
300
|
-
|
|
301
|
-
노드를 가리키는 인자(`target`, `databaseId`, `spreadsheetId`, `formId`, `crmId`, `trackerId`,
|
|
302
|
-
`recordingId`, `presentationId`, `whiteboardId`, `logId`, `parentId` 등)는 **노드 id와 경로를 모두**
|
|
303
|
-
받습니다 — CLI와 같은 규칙으로 `/`로 시작하면 경로로 해석합니다.
|
|
304
|
-
즉 `rootr_add_row`에 `databaseId: "/제작 공정/칸반"`을 그대로 넘길 수 있어,
|
|
305
|
-
경로만 아는 에이전트가 uuid를 찾아 헤맬 필요가 없습니다.
|
|
306
|
-
`rootr_list`·`rootr_search` 출력도 각 줄 끝에 `[노드 id]`를 함께 표시합니다.
|
|
319
|
+
Sends bugs, friction and ideas to the Rootr team. **No login, no workspace, no API key required**
|
|
320
|
+
— it works even when a wrong key means nothing else does, and that is exactly the report we most
|
|
321
|
+
want. It does not count against usage limits and does not consume credits.
|
|
307
322
|
|
|
308
|
-
|
|
323
|
+
`--kind` is one of `bug`, `friction`, `idea`, `praise`, `other` (default `other`). Without
|
|
324
|
+
`--title` the first line of the body becomes the title. Pass `--email` only if you want a reply.
|
|
325
|
+
The same body sent twice within 10 minutes is merged into one report, so retry loops do not
|
|
326
|
+
pollute the queue.
|
|
309
327
|
|
|
310
|
-
|
|
311
|
-
|---|---|
|
|
312
|
-
| `rootr_list` | 워크스페이스 트리 목록 |
|
|
313
|
-
| `rootr_read` | 문서 마크다운 읽기 |
|
|
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` | 노드 옮기기 / 이름 바꾸기 |
|
|
328
|
+
## Usage limits
|
|
322
329
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
각 도구 설명에 명시되어 있습니다.
|
|
330
|
+
Only **read-type** calls (`docs:read` / `graph:read` / `ask`) made programmatically (API key or
|
|
331
|
+
MCP) are metered. Writes and uploads are not limited.
|
|
326
332
|
|
|
327
|
-
|
|
333
|
+
| Plan | Limit |
|
|
334
|
+
| --- | --- |
|
|
335
|
+
| Free | **180 calls per day** (resets at midnight KST) |
|
|
336
|
+
| Team | 5,000 per hour |
|
|
337
|
+
| Business | 50,000 per hour |
|
|
338
|
+
| Platform | Unlimited |
|
|
328
339
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
| `rootr_attach_image_to_document` | 위 업로드 + 지정 문서에 `rootr_append`로 바로 삽입 (가장 흔한 용법) |
|
|
340
|
+
At 80% of the limit, MCP tool responses append a note with the remaining count. At the limit you
|
|
341
|
+
get a 429 with an upgrade link. The response headers carry the same information
|
|
342
|
+
(`X-RateLimit-Remaining`, `X-RateLimit-Reset`, `X-RateLimit-Window`).
|
|
333
343
|
|
|
334
|
-
|
|
335
|
-
그대로 쓸 수 있습니다. CLI에서는 `rootr attach <file> [--doc <path|id>] [--heading "## X"] [--alt <text>]`.
|
|
344
|
+
## MCP tools
|
|
336
345
|
|
|
337
|
-
|
|
346
|
+
`rootr mcp` speaks MCP over stdio. 167 tools:
|
|
338
347
|
|
|
339
|
-
|
|
|
348
|
+
| Group | Count | Tools |
|
|
340
349
|
|---|---|---|
|
|
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" 섹션**에 표로 정리돼 있습니다.
|
|
350
|
+
| Documents | 22 | list, read, write, append, edit, search, comment, version history, commits & merges, publish, trash & restore |
|
|
351
|
+
| Databases | 26 | create, columns, views, rows (single & bulk), row pages, permissions, notifications, buttons |
|
|
352
|
+
| CRM | 18 | companies, contacts, deals (incl. pipeline moves), activities, tasks, CSV import |
|
|
353
|
+
| Signed documents & research notes | 14 | create, sign, revise, reject, reopen, approval lines, signing codes, ledger verification, research-note preset |
|
|
354
|
+
| Forms | 10 | create, read, update, responses, share links, collectors |
|
|
355
|
+
| Presentations & images | 10 | decks, slides, diagram slides, image generation and background removal |
|
|
356
|
+
| Workspaces & scaffolding | 9 | list, create, delete, switch, plan / review / apply a document tree, health check |
|
|
357
|
+
| Pages | 6 | HTML page nodes: create, read, update, append and patch blocks, live data |
|
|
358
|
+
| Spreadsheets | 7 | create, read, update, per-sheet create/update/delete, patch cells & formulas |
|
|
359
|
+
| Recordings | 7 | create, upload & download audio, transcribe, summarize, rename speakers |
|
|
360
|
+
| Issue tracker | 6 | create tracker, list / create / get / update issue, comment |
|
|
361
|
+
| Permissions & visibility | 10 | grant / revoke node permissions, read access, visibility, public status, read requirements |
|
|
362
|
+
| LOG datastores | 5 | create store, update fields, add entries, query, stats |
|
|
363
|
+
| Templates | 4 | list, apply, save as template, update |
|
|
364
|
+
| Whiteboards | 3 | create, read and update the shapes & edges scene |
|
|
365
|
+
| Attachments | 2 | upload a file, attach an image straight into a document |
|
|
366
|
+
| Agent memory | 3 | remember, recall, forget |
|
|
367
|
+
| Webhooks | 3 | list, create (secret shown once), delete |
|
|
368
|
+
| Root-cause Q&A | 1 | ask the workspace knowledge graph, answer with citations |
|
|
369
|
+
| Feedback | 1 | send feedback to the Rootr team |
|
|
370
|
+
|
|
371
|
+
Guidance baked into the tool descriptions: agents should reach for `rootr_append` and
|
|
372
|
+
`rootr_edit`, and use `rootr_write` only for a genuine full rewrite (ideally with `ifMatch`).
|
|
373
|
+
Tools that take a `workspace` argument fall back to `ROOTR_WORKSPACE` / the config file, and
|
|
374
|
+
return a clear error if neither is set. Every tool description is written in English (it is the
|
|
375
|
+
schema an agent consumes), and tools that return JSON reply with pretty-printed JSON text.
|
|
376
|
+
|
|
377
|
+
Scope notes: document, database, spreadsheet, whiteboard, form, page, presentation, recording,
|
|
378
|
+
signed-document, issue, CRM and LOG tools need `docs:read` / `docs:write`; `rootr_ask` needs
|
|
379
|
+
`ask`; webhook tools need `webhooks:manage`; `rootr_create_workspace` needs an account key with
|
|
380
|
+
`workspaces:create`.
|
|
381
|
+
|
|
382
|
+
### Pages
|
|
383
|
+
|
|
384
|
+
A PAGE is **a screen for people outside the workspace** — an event announcement, a product page,
|
|
385
|
+
a sign-up. You do not write HTML: you stack **14 predefined block types** — `hero`, `text`,
|
|
386
|
+
`features`, `gallery`, `pricing`, `testimonials`, `faq`, `timeline`, `cta`, `footer`, the
|
|
387
|
+
table-backed `liveStats`, `liveTable`, `liveChart`, the `form` block, and the free-form `custom`.
|
|
388
|
+
|
|
389
|
+
`custom` is an **isolated room**: write any HTML/CSS you like, but it renders inside a `sandbox`
|
|
390
|
+
iframe (no scripts, not same-origin, no outbound calls), so even bold CSS cannot leak onto the
|
|
391
|
+
rest of the page. `<script>` and `on*=` attributes are stripped on save. Inside the room you can
|
|
392
|
+
use the page's palette through `var(--pg-text)`, `var(--pg-card)`, `var(--pg-accent)`.
|
|
393
|
+
Per-block props are tabulated in the **"Pages" section of [`/llms.txt`](https://rootr.io/llms.txt)**.
|
|
677
394
|
|
|
678
395
|
```bash
|
|
679
|
-
#
|
|
396
|
+
# create a page (omit blocks to start from a hero/text/footer skeleton)
|
|
680
397
|
curl -X POST "$BASE/workspaces/$WS/pages" -H "x-api-key: $KEY" \
|
|
681
398
|
-H 'Content-Type: application/json' \
|
|
682
|
-
-d '{"name":"
|
|
683
|
-
"blocks":[{"type":"hero","props":{"title":"
|
|
399
|
+
-d '{"name":"Autumn meetup","config":{"theme":"midnight"},
|
|
400
|
+
"blocks":[{"type":"hero","props":{"title":"Autumn Developer Meetup","subtitle":"Oct 12 · Seoul"}}]}'
|
|
684
401
|
|
|
685
|
-
#
|
|
686
|
-
curl -X POST "$BASE/pages/$ID/blocks" -d '{"blocks":[{"type":"faq","props":{"items":[
|
|
402
|
+
# append blocks (existing ones untouched) / replace config / read live values
|
|
403
|
+
curl -X POST "$BASE/pages/$ID/blocks" -d '{"blocks":[{"type":"faq","props":{"items":[]}}]}' ...
|
|
687
404
|
curl -X PATCH "$BASE/pages/$ID" -d '{"config":{"theme":"warm"}}' ...
|
|
688
|
-
curl
|
|
405
|
+
curl "$BASE/pages/$ID/live-data" -H "x-api-key: $KEY"
|
|
689
406
|
```
|
|
690
407
|
|
|
691
|
-
`liveStats
|
|
692
|
-
|
|
693
|
-
`
|
|
694
|
-
|
|
695
|
-
|
|
408
|
+
For `liveStats` / `liveTable` / `liveChart`, `source.nodeId` is a DATABASE or LOG node in the
|
|
409
|
+
same workspace and columns are referenced **by name** (not by column id). Point a `form` block's
|
|
410
|
+
`formNodeId` at a form node and visitors submit **right there** — the form does not have to be
|
|
411
|
+
published separately. Tables and forms that live under a PRIVATE subtree are silently dropped
|
|
412
|
+
from a public page, on purpose.
|
|
696
413
|
|
|
697
|
-
|
|
414
|
+
Publishing works like any other node: `POST /v1/nodes/:id/publish` → `rootr.io/p/{slug}`.
|
|
698
415
|
|
|
699
|
-
|
|
416
|
+
### Presentations
|
|
700
417
|
|
|
701
|
-
|
|
702
|
-
`
|
|
703
|
-
`
|
|
704
|
-
`
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
호출**해도 됩니다 (`x-api-key` 헤더, `docs:write`):
|
|
418
|
+
Decks are authored with `rootr_create_presentation`, `rootr_read_presentation`,
|
|
419
|
+
`rootr_append_presentation_slides`, `rootr_update_presentation_slide`,
|
|
420
|
+
`rootr_reorder_presentation_slides` and `rootr_update_presentation`. Artwork can be produced with
|
|
421
|
+
`rootr_generate_image` (image from a sentence) and `rootr_remove_image_background` — both spend
|
|
422
|
+
AI credits. The same thing works over plain REST with the same API key (`x-api-key`,
|
|
423
|
+
`docs:write`):
|
|
708
424
|
|
|
709
425
|
```bash
|
|
710
|
-
#
|
|
426
|
+
# create a deck (slides optional)
|
|
711
427
|
curl -X POST "$BASE/workspaces/$WS/presentations" -H "x-api-key: $KEY" \
|
|
712
428
|
-H 'Content-Type: application/json' \
|
|
713
|
-
-d '{"name":"
|
|
429
|
+
-d '{"name":"Proposal","slides":[{"id":"SLD-001","kind":"cover","title":"..."}]}'
|
|
714
430
|
|
|
715
|
-
#
|
|
431
|
+
# patch one slide (merge) / append / reorder
|
|
716
432
|
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":[
|
|
433
|
+
-H 'Content-Type: application/json' -d '{"slide":{"notes":"speaker notes"}}'
|
|
434
|
+
curl -X POST "$BASE/presentations/$ID/slides" -d '{"slides":[]}' ...
|
|
719
435
|
curl -X POST "$BASE/presentations/$ID/reorder" -d '{"order":["SLD-002","SLD-001"]}' ...
|
|
720
436
|
```
|
|
721
437
|
|
|
722
|
-
|
|
438
|
+
#### Diagrams on a slide
|
|
723
439
|
|
|
724
|
-
|
|
725
|
-
`rootr_create_diagram_slide
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
이 도구를 쓰는 것이 유일한 방법입니다.
|
|
440
|
+
For architecture, workflow, sequence, dataflow and lifecycle diagrams, do not hand-write SVG.
|
|
441
|
+
Pass a **typed JSON spec** to `rootr_create_diagram_slide`; the server validates it, renders it,
|
|
442
|
+
and drops it onto the slide — it survives PDF and PPTX export too. A slide's `diagram` (mermaid)
|
|
443
|
+
field is **not rendered by the viewer**, so this tool is the only way.
|
|
729
444
|
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
445
|
+
Each type has its own spec shape, so **fetch the schema and an example first with
|
|
446
|
+
`rootr_diagram_schema`**. A spec that does not fit is rejected with which field is wrong and how
|
|
447
|
+
to fix it, so you can correct it and call again.
|
|
733
448
|
|
|
734
449
|
```bash
|
|
735
|
-
#
|
|
450
|
+
# see the spec shape (architecture | workflow | sequence | dataflow | lifecycle)
|
|
736
451
|
curl "$BASE/diagram-types/workflow/schema" -H "x-api-key: $KEY"
|
|
737
452
|
|
|
738
|
-
#
|
|
453
|
+
# render it onto a slide (pass slideId to redraw an existing slide)
|
|
739
454
|
curl -X POST "$BASE/presentations/$ID/diagram-slides" -H "x-api-key: $KEY" \
|
|
740
455
|
-H 'Content-Type: application/json' \
|
|
741
|
-
-d '{"type":"workflow","spec":{
|
|
742
|
-
"blocks":[{"heading":"
|
|
456
|
+
-d '{"type":"workflow","spec":{},"title":"An issue reaches main only through review",
|
|
457
|
+
"blocks":[{"heading":"Review is the gate","body":"..."}]}'
|
|
743
458
|
```
|
|
744
459
|
|
|
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
|
-
크레딧 차감)를 사용합니다.
|
|
460
|
+
`quality` defaults to `standard`; `showcase` applies the stricter bar meant for hand-tuned hero
|
|
461
|
+
diagrams and will reject specs that `standard` accepts. Text inside a rendered diagram does not
|
|
462
|
+
reach the knowledge graph, so keep the facts in `title`, `blocks` and `notes` as well.
|
|
756
463
|
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
464
|
+
**For high-quality decks, bake self-contained 1280×720 HTML into the slide's `html` field** — the
|
|
465
|
+
viewer renders it verbatim instead of the default template, giving you a completely free design.
|
|
466
|
+
The rules (inline everything because outbound requests are blocked, images as data URIs, a font
|
|
467
|
+
fallback stack, `<span class="pn">` for page numbers, and keeping the text fields filled so the
|
|
468
|
+
deck still feeds the knowledge graph) are documented in the **"Presentations" section of
|
|
469
|
+
[`/llms.txt`](https://rootr.io/llms.txt)** — read it before authoring. AI image generation uses
|
|
470
|
+
`POST /v1/workspaces/:ws/images/generate` and spends AI credits.
|
|
761
471
|
|
|
762
|
-
### Claude Code / Claude Desktop
|
|
763
|
-
|
|
764
|
-
`~/.claude.json`(Claude Code) 또는 Claude Desktop의 MCP 설정 파일에 다음을 추가:
|
|
472
|
+
### Register with Claude Code / Claude Desktop
|
|
765
473
|
|
|
766
474
|
```json
|
|
767
475
|
{
|
|
768
476
|
"mcpServers": {
|
|
769
477
|
"rootr": {
|
|
770
|
-
"command": "
|
|
771
|
-
"args": ["
|
|
478
|
+
"command": "npx",
|
|
479
|
+
"args": ["-y", "rootr-cli", "mcp"],
|
|
772
480
|
"env": {
|
|
773
481
|
"ROOTR_API_KEY": "rootr_xxxxxxxxxxxxxxxx",
|
|
774
482
|
"ROOTR_WORKSPACE": "ws_123"
|
|
@@ -778,34 +486,48 @@ curl -X POST "$BASE/presentations/$ID/diagram-slides" -H "x-api-key: $KEY" \
|
|
|
778
486
|
}
|
|
779
487
|
```
|
|
780
488
|
|
|
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
|
-
|
|
489
|
+
With a global install, use `"command": "rootr"` and `"args": ["mcp"]`. From a clone, point
|
|
490
|
+
`command` at `node` and `args` at `["/path/to/rootr-cli/bin/rootr.js", "mcp"]`.
|
|
491
|
+
|
|
492
|
+
## Errors
|
|
493
|
+
|
|
494
|
+
On a non-2xx response the CLI prints the API's `message` to stderr and exits 1, with hints:
|
|
495
|
+
|
|
496
|
+
- `401` / `403` — check the API key and workspace scopes
|
|
497
|
+
- `412` — document changed since you read it; read again and retry (If-Match mismatch)
|
|
498
|
+
- `409` — the server's reason is shown verbatim (e.g. `edit` found no unique match)
|
|
499
|
+
- `429` — usage limit reached; the message carries the reset time and an upgrade link
|
|
500
|
+
|
|
501
|
+
## Development
|
|
502
|
+
|
|
503
|
+
- Dependencies: `@modelcontextprotocol/sdk` (MCP server) and `zod` (tool input schemas). The CLI
|
|
504
|
+
itself (`bin/rootr.js`, `lib/config.js`, `lib/client.js`, `lib/resolve.js`) has none.
|
|
505
|
+
- No build step — plain ESM JavaScript.
|
|
506
|
+
|
|
507
|
+
```
|
|
508
|
+
bin/rootr.js entry point, command dispatch
|
|
509
|
+
lib/config.js config load/save
|
|
510
|
+
lib/credentials.js API key / workspace resolution
|
|
511
|
+
lib/context.js per-call request context
|
|
512
|
+
lib/client.js Rootr REST client
|
|
513
|
+
lib/resolve.js path/id target resolution
|
|
514
|
+
lib/mcp.js MCP stdio server, assembles the tool modules
|
|
515
|
+
lib/mcp-tools/*.js one module per tool group (shared, documents, pages, workspaces,
|
|
516
|
+
databases, spreadsheets, whiteboards, forms, presentations,
|
|
517
|
+
recordings, signed, templates, attachments, public, memory,
|
|
518
|
+
logs, issues, crm, webhooks, ask, feedback, misc)
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
Smoke-test the MCP server without any credentials — it must start and list its tools:
|
|
522
|
+
|
|
523
|
+
```bash
|
|
524
|
+
printf '%s\n' \
|
|
525
|
+
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
|
|
526
|
+
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
|
|
527
|
+
'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
|
|
528
|
+
| node bin/rootr.js mcp
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
## License
|
|
532
|
+
|
|
533
|
+
MIT — see [`LICENSE`](LICENSE).
|