@grigoreo-dev/otask-mcp 1.2.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -19
- package/dist/docs/parser.d.ts.map +1 -1
- package/dist/docs/parser.js +7 -5
- package/dist/docs/parser.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp-http.js +26 -10
- package/dist/mcp-http.js.map +1 -1
- package/dist/schemas/task.d.ts +27 -27
- package/dist/schemas/task.d.ts.map +1 -1
- package/dist/schemas/task.js +15 -32
- package/dist/schemas/task.js.map +1 -1
- package/dist/schemas/workspace.d.ts +48 -21
- package/dist/schemas/workspace.d.ts.map +1 -1
- package/dist/schemas/workspace.js +23 -8
- package/dist/schemas/workspace.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +11 -4
- package/dist/server.js.map +1 -1
- package/dist/services/api.d.ts +3 -1
- package/dist/services/api.d.ts.map +1 -1
- package/dist/services/api.js +46 -2
- package/dist/services/api.js.map +1 -1
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +1 -3
- package/dist/services/auth.js.map +1 -1
- package/dist/services/client.d.ts +3 -1
- package/dist/services/client.d.ts.map +1 -1
- package/dist/services/client.js +3 -1
- package/dist/services/client.js.map +1 -1
- package/dist/services/due-filter.d.ts +27 -0
- package/dist/services/due-filter.d.ts.map +1 -0
- package/dist/services/due-filter.js +92 -0
- package/dist/services/due-filter.js.map +1 -0
- package/dist/services/me-cache.d.ts +14 -0
- package/dist/services/me-cache.d.ts.map +1 -0
- package/dist/services/me-cache.js +47 -0
- package/dist/services/me-cache.js.map +1 -0
- package/dist/services/project-guard.d.ts.map +1 -1
- package/dist/services/project-guard.js.map +1 -1
- package/dist/services/scope.d.ts +45 -0
- package/dist/services/scope.d.ts.map +1 -0
- package/dist/services/scope.js +146 -0
- package/dist/services/scope.js.map +1 -0
- package/dist/services/task-mapper.d.ts +4 -0
- package/dist/services/task-mapper.d.ts.map +1 -1
- package/dist/services/task-mapper.js +9 -0
- package/dist/services/task-mapper.js.map +1 -1
- package/dist/tools/add-comment.d.ts +1 -1
- package/dist/tools/add-comment.d.ts.map +1 -1
- package/dist/tools/add-comment.js +10 -9
- package/dist/tools/add-comment.js.map +1 -1
- package/dist/tools/archive-task.d.ts +1 -1
- package/dist/tools/archive-task.d.ts.map +1 -1
- package/dist/tools/archive-task.js +10 -9
- package/dist/tools/archive-task.js.map +1 -1
- package/dist/tools/create-task.d.ts +1 -1
- package/dist/tools/create-task.d.ts.map +1 -1
- package/dist/tools/create-task.js +8 -8
- package/dist/tools/create-task.js.map +1 -1
- package/dist/tools/get-task.d.ts +1 -1
- package/dist/tools/get-task.d.ts.map +1 -1
- package/dist/tools/get-task.js +6 -4
- package/dist/tools/get-task.js.map +1 -1
- package/dist/tools/list-board.d.ts +1 -1
- package/dist/tools/list-board.d.ts.map +1 -1
- package/dist/tools/list-board.js +14 -10
- package/dist/tools/list-board.js.map +1 -1
- package/dist/tools/list-comments.d.ts +1 -1
- package/dist/tools/list-comments.d.ts.map +1 -1
- package/dist/tools/list-comments.js +10 -9
- package/dist/tools/list-comments.js.map +1 -1
- package/dist/tools/list-members.d.ts +1 -1
- package/dist/tools/list-members.d.ts.map +1 -1
- package/dist/tools/list-members.js +6 -4
- package/dist/tools/list-members.js.map +1 -1
- package/dist/tools/list-project-tasks.d.ts +1 -1
- package/dist/tools/list-project-tasks.d.ts.map +1 -1
- package/dist/tools/list-project-tasks.js +8 -7
- package/dist/tools/list-project-tasks.js.map +1 -1
- package/dist/tools/list-projects.d.ts +1 -1
- package/dist/tools/list-projects.d.ts.map +1 -1
- package/dist/tools/list-projects.js +6 -4
- package/dist/tools/list-projects.js.map +1 -1
- package/dist/tools/list-tags.d.ts +1 -1
- package/dist/tools/list-tags.d.ts.map +1 -1
- package/dist/tools/list-tags.js +6 -4
- package/dist/tools/list-tags.js.map +1 -1
- package/dist/tools/list-tasks.d.ts +4 -0
- package/dist/tools/list-tasks.d.ts.map +1 -0
- package/dist/tools/list-tasks.js +113 -0
- package/dist/tools/list-tasks.js.map +1 -0
- package/dist/tools/me.d.ts +3 -0
- package/dist/tools/me.d.ts.map +1 -0
- package/dist/tools/me.js +36 -0
- package/dist/tools/me.js.map +1 -0
- package/dist/tools/move-task.d.ts +1 -1
- package/dist/tools/move-task.d.ts.map +1 -1
- package/dist/tools/move-task.js +11 -10
- package/dist/tools/move-task.js.map +1 -1
- package/dist/tools/registry.d.ts +3 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +4 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/types.d.ts +7 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/update-task.d.ts +1 -1
- package/dist/tools/update-task.d.ts.map +1 -1
- package/dist/tools/update-task.js +20 -33
- package/dist/tools/update-task.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -32,24 +32,32 @@ stdio требует `OTASK_*` (без них падает при старте).
|
|
|
32
32
|
| `OTASK_EMAIL` | stdio, HTTP gateway | вместе с `OTASK_PASSWORD` как альтернатива ключу | Логин для получения токена |
|
|
33
33
|
| `OTASK_PASSWORD` | stdio, HTTP gateway | вместе с `OTASK_EMAIL` | Пароль для логина |
|
|
34
34
|
| `MCP_AUTH_TOKEN` | HTTP gateway | режим gateway | Общий секрет, который должен отправлять клиент; **не** токен O!task |
|
|
35
|
-
| `
|
|
35
|
+
| `OTASK_DEFAULT_WS` | stdio, HTTP | опционально | Workspace slug по умолчанию (если tool не передал `ws_slug`) |
|
|
36
|
+
| `OTASK_DEFAULT_PROJECT` | stdio, HTTP | опционально | Project slug **или** numeric id по умолчанию |
|
|
37
|
+
| `OTASK_ALLOWED_WS` | stdio, HTTP gateway | опционально | Allow-list workspace slug через запятую |
|
|
38
|
+
| `OTASK_ALLOWED_PROJECTS` | stdio, HTTP gateway | опционально | Allow-list project slug и/или numeric id через запятую |
|
|
36
39
|
| `PORT` | HTTP | опционально (по умолчанию `3847`) | Порт прослушивания |
|
|
37
40
|
| `HOST` | HTTP | опционально (по умолчанию `0.0.0.0`) | Адрес привязки |
|
|
38
41
|
|
|
42
|
+
Default должен входить в allow-list, если list непустой (иначе сервер падает при старте).
|
|
43
|
+
|
|
39
44
|
## HTTP-заголовки
|
|
40
45
|
|
|
41
46
|
| Заголовок | Режим | Назначение |
|
|
42
47
|
|-----------|-------|------------|
|
|
43
48
|
| `Authorization: Bearer …` | gateway | Должен совпадать с `MCP_AUTH_TOKEN` |
|
|
44
49
|
| `Authorization: Bearer …` | passthrough | Токен O!task API; проксируется на каждый запрос к API |
|
|
45
|
-
| `X-Otask-Allowed-Projects` | **только passthrough** |
|
|
50
|
+
| `X-Otask-Allowed-Projects` | **только passthrough** | Allow-list projects; в gateway — env |
|
|
51
|
+
| `X-Otask-Allowed-Ws` | **только passthrough** | Allow-list workspaces |
|
|
52
|
+
| `X-Otask-Default-Ws` | **passthrough** (override env) | Default workspace slug |
|
|
53
|
+
| `X-Otask-Default-Project` | **passthrough** (override env) | Default project slug/id |
|
|
46
54
|
|
|
47
55
|
## Эндпоинты (HTTP)
|
|
48
56
|
|
|
49
57
|
| | |
|
|
50
58
|
|---|---|
|
|
51
59
|
| MCP | `POST`/`GET` `/mcp` (Streamable HTTP) |
|
|
52
|
-
| Health | `GET /health` → `{ ok, mode, authMode, projectGuard
|
|
60
|
+
| Health | `GET /health` → `{ ok, mode, authMode, projectGuard, wsGuard, defaults }` (`"env" \| "header" \| "off"`) |
|
|
53
61
|
|
|
54
62
|
Пример деплоя: `https://otask-mcp.grigoreo.dev/mcp` (порт `3847` в Docker).
|
|
55
63
|
|
|
@@ -62,7 +70,10 @@ Env сервера:
|
|
|
62
70
|
```env
|
|
63
71
|
OTASK_AUTH_KEY=...
|
|
64
72
|
MCP_AUTH_TOKEN=super-secret-mcp-token
|
|
65
|
-
|
|
73
|
+
OTASK_DEFAULT_WS=246cd090-27a2-4f00-b4d6-2018d4d7ffe1
|
|
74
|
+
OTASK_DEFAULT_PROJECT=3156e838-b2b8-4537-8379-97131c22f60b
|
|
75
|
+
OTASK_ALLOWED_WS=246cd090-27a2-4f00-b4d6-2018d4d7ffe1
|
|
76
|
+
OTASK_ALLOWED_PROJECTS=3156e838-b2b8-4537-8379-97131c22f60b,35747
|
|
66
77
|
```
|
|
67
78
|
|
|
68
79
|
n8n **MCP Client Tool**:
|
|
@@ -70,7 +81,7 @@ n8n **MCP Client Tool**:
|
|
|
70
81
|
- URL: `https://otask-mcp.example/mcp`
|
|
71
82
|
- Transport: **HTTP Streamable**
|
|
72
83
|
- Credential / header: `Authorization: Bearer super-secret-mcp-token`
|
|
73
|
-
- **Не** отправляйте `X-Otask
|
|
84
|
+
- **Не** отправляйте `X-Otask-*` allow/default headers (берутся из env сервера)
|
|
74
85
|
|
|
75
86
|
### Passthrough (токен O!task у клиента)
|
|
76
87
|
|
|
@@ -81,13 +92,16 @@ n8n **MCP Client Tool**:
|
|
|
81
92
|
- URL: `https://otask-mcp.example/mcp`
|
|
82
93
|
- Transport: **HTTP Streamable**
|
|
83
94
|
- Credential / header: `Authorization: Bearer <тот же токен, что и для api.otask.ru>`
|
|
84
|
-
- Опционально: `X-Otask-Allowed-Projects
|
|
95
|
+
- Опционально: `X-Otask-Allowed-Projects`, `X-Otask-Allowed-Ws`, `X-Otask-Default-Ws`, `X-Otask-Default-Project`
|
|
85
96
|
|
|
86
97
|
### Stdio (Cursor / OpenCode)
|
|
87
98
|
|
|
88
99
|
```env
|
|
89
100
|
OTASK_AUTH_KEY=...
|
|
90
101
|
# или OTASK_EMAIL + OTASK_PASSWORD
|
|
102
|
+
OTASK_DEFAULT_WS=...
|
|
103
|
+
OTASK_DEFAULT_PROJECT=my-project
|
|
104
|
+
OTASK_ALLOWED_WS=...
|
|
91
105
|
OTASK_ALLOWED_PROJECTS=my-project
|
|
92
106
|
```
|
|
93
107
|
|
|
@@ -101,6 +115,8 @@ bun start
|
|
|
101
115
|
|
|
102
116
|
| Инструмент | Назначение |
|
|
103
117
|
|------------|------------|
|
|
118
|
+
| `otask_me` | Текущий пользователь (id, имя, email, timezone) |
|
|
119
|
+
| `otask_list_tasks` | Задачи воркспейса; по умолчанию `mine=true`; фильтры `performer_ids`, `project_ids`, `priority_ids`, `due`, `page` |
|
|
104
120
|
| `otask_get_task` | Получить одну задачу по workspace + slug задачи (посмотреть поля перед обновлением) |
|
|
105
121
|
| `otask_update_task` | Обновить существующую задачу (name, board, performers, tags, description, …) |
|
|
106
122
|
| `otask_list_projects` | Список проектов воркспейса (с фильтром по allow-list, если задан) |
|
|
@@ -114,27 +130,37 @@ bun start
|
|
|
114
130
|
| `otask_move_task` | Переместить задачу в другую колонку доски (статус) |
|
|
115
131
|
| `otask_archive_task` | Архивировать задачу |
|
|
116
132
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
## Allow-list проектов
|
|
133
|
+
Inbox (после настройки `OTASK_DEFAULT_WS`):
|
|
120
134
|
|
|
121
|
-
|
|
135
|
+
```text
|
|
136
|
+
# утренний inbox
|
|
137
|
+
otask_me
|
|
138
|
+
otask_list_tasks # mine=true
|
|
139
|
+
otask_list_tasks due=today
|
|
140
|
+
otask_list_tasks due=overdue
|
|
141
|
+
```
|
|
122
142
|
|
|
123
|
-
|
|
143
|
+
Если активен allow-list проектов, project-scoped инструменты проверяют членство (или фильтруют списки); пустой allow-list = доступны все проекты.
|
|
124
144
|
|
|
125
|
-
|
|
126
|
-
OTASK_ALLOWED_PROJECTS=product-roadmap,eng-backlog,42
|
|
127
|
-
```
|
|
145
|
+
## Defaults и allow-list (ws + projects)
|
|
128
146
|
|
|
129
|
-
|
|
147
|
+
| Что | Env (gateway/stdio) | Header (passthrough) |
|
|
148
|
+
|-----|---------------------|----------------------|
|
|
149
|
+
| Default workspace | `OTASK_DEFAULT_WS` | `X-Otask-Default-Ws` (override) |
|
|
150
|
+
| Default project | `OTASK_DEFAULT_PROJECT` (slug или id) | `X-Otask-Default-Project` |
|
|
151
|
+
| Limit workspaces | `OTASK_ALLOWED_WS` | `X-Otask-Allowed-Ws` |
|
|
152
|
+
| Limit projects | `OTASK_ALLOWED_PROJECTS` | `X-Otask-Allowed-Projects` |
|
|
130
153
|
|
|
131
|
-
|
|
154
|
+
Формат allow-list: значения через запятую (пробелы обрезаются). Projects: **slug** и/или **numeric id**. WS: только slug. Пусто = off.
|
|
132
155
|
|
|
133
|
-
```
|
|
134
|
-
|
|
156
|
+
```env
|
|
157
|
+
OTASK_DEFAULT_WS=246cd090-27a2-4f00-b4d6-2018d4d7ffe1
|
|
158
|
+
OTASK_DEFAULT_PROJECT=3156e838-b2b8-4537-8379-97131c22f60b
|
|
159
|
+
OTASK_ALLOWED_WS=246cd090-27a2-4f00-b4d6-2018d4d7ffe1
|
|
160
|
+
OTASK_ALLOWED_PROJECTS=3156e838-b2b8-4537-8379-97131c22f60b,product-roadmap,42
|
|
135
161
|
```
|
|
136
162
|
|
|
137
|
-
`
|
|
163
|
+
`otask_list_board` по умолчанию шлёт `type=status` (так требует O!task API).
|
|
138
164
|
|
|
139
165
|
## Снимок API-документации
|
|
140
166
|
|
|
@@ -166,3 +192,7 @@ bun run dev:http # HTTP hot reload
|
|
|
166
192
|
4. `src/tools/registry.ts` — добавить factory в `toolFactories`
|
|
167
193
|
|
|
168
194
|
`server.ts` / `register.ts` править не нужно — регистрация централизована.
|
|
195
|
+
|
|
196
|
+
## Contributing
|
|
197
|
+
|
|
198
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup, PR checks, and the release tag flow.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/docs/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/docs/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA4C,MAAM,YAAY,CAAC;AAmIxF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAsB5D"}
|
package/dist/docs/parser.js
CHANGED
|
@@ -27,13 +27,16 @@ function parseSidebar(html) {
|
|
|
27
27
|
const endpointIds = [];
|
|
28
28
|
const endpointTitles = new Map();
|
|
29
29
|
const subRe = /href=["']#([^"']+)["'][^>]*class=["'][^"']*sidebar__submenu-link[^"']*["'][^>]*>([\s\S]*?)<\/a>/gi;
|
|
30
|
-
let sm;
|
|
31
|
-
while (
|
|
30
|
+
let sm = subRe.exec(part);
|
|
31
|
+
while (sm !== null) {
|
|
32
32
|
const epId = sm[1];
|
|
33
|
-
if (epId === id)
|
|
33
|
+
if (epId === id) {
|
|
34
|
+
sm = subRe.exec(part);
|
|
34
35
|
continue;
|
|
36
|
+
}
|
|
35
37
|
endpointIds.push(epId);
|
|
36
38
|
endpointTitles.set(epId, stripTags(sm[2]));
|
|
39
|
+
sm = subRe.exec(part);
|
|
37
40
|
}
|
|
38
41
|
scopes.push({ id, title, endpointIds, endpointTitles });
|
|
39
42
|
}
|
|
@@ -73,8 +76,7 @@ function parseEndpointSlice(slice, id, sidebarTitle) {
|
|
|
73
76
|
return null;
|
|
74
77
|
const pathMatch = text.match(/\/api\/v1\/[^\s<"]+/);
|
|
75
78
|
const path = pathMatch?.[0]?.replace(/[.,;)]+$/, "") ?? "";
|
|
76
|
-
const authRequired = /Требуется аутентификация/i.test(text) ||
|
|
77
|
-
/required authentication/i.test(text);
|
|
79
|
+
const authRequired = /Требуется аутентификация/i.test(text) || /required authentication/i.test(text);
|
|
78
80
|
let title = sidebarTitle ?? "";
|
|
79
81
|
if (!title) {
|
|
80
82
|
const escaped = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
package/dist/docs/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/docs/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/docs/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
-
import { createEnvAuthResolver, validateStdioAuthConfig } from "./services/auth.js";
|
|
4
|
-
import { projectGuardFromEnv } from "./services/project-guard.js";
|
|
5
3
|
import { createMcpServer } from "./server.js";
|
|
4
|
+
import { createEnvAuthResolver, validateStdioAuthConfig } from "./services/auth.js";
|
|
5
|
+
import { assertDefaultsAllowed, scopeFromEnv } from "./services/scope.js";
|
|
6
6
|
async function main() {
|
|
7
7
|
try {
|
|
8
8
|
validateStdioAuthConfig();
|
|
9
|
+
const scope = scopeFromEnv();
|
|
10
|
+
assertDefaultsAllowed(scope);
|
|
11
|
+
const server = createMcpServer(createEnvAuthResolver(), scope);
|
|
12
|
+
const transport = new StdioServerTransport();
|
|
13
|
+
await server.connect(transport);
|
|
9
14
|
}
|
|
10
15
|
catch (error) {
|
|
11
16
|
const message = error instanceof Error ? error.message : String(error);
|
|
12
17
|
console.error(`ERROR: ${message}`);
|
|
13
18
|
process.exit(1);
|
|
14
19
|
}
|
|
15
|
-
const server = createMcpServer(createEnvAuthResolver(), projectGuardFromEnv());
|
|
16
|
-
const transport = new StdioServerTransport();
|
|
17
|
-
await server.connect(transport);
|
|
18
20
|
}
|
|
19
21
|
main().catch((error) => {
|
|
20
22
|
console.error("Server error:", error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,uBAAuB,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;QAC7B,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG,eAAe,CAAC,qBAAqB,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/mcp-http.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import http from "node:http";
|
|
3
3
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
4
|
import { createMcpServer } from "./server.js";
|
|
5
|
-
import { authorizeHttpMcpRequest, createEnvAuthResolver, createPassthroughAuthResolver, extractBearerToken,
|
|
6
|
-
import {
|
|
5
|
+
import { authorizeHttpMcpRequest, createEnvAuthResolver, createPassthroughAuthResolver, extractBearerToken, getHttpAuthMode, validateHttpAuthConfig, } from "./services/auth.js";
|
|
6
|
+
import { assertDefaultsAllowed, resolveHttpScope, scopeFromEnv } from "./services/scope.js";
|
|
7
7
|
function getPort() {
|
|
8
8
|
const raw = process.env.PORT?.trim() || "3847";
|
|
9
9
|
const port = Number.parseInt(raw, 10);
|
|
@@ -16,6 +16,20 @@ function sendJson(res, status, body) {
|
|
|
16
16
|
res.writeHead(status, { "Content-Type": "application/json" });
|
|
17
17
|
res.end(JSON.stringify(body));
|
|
18
18
|
}
|
|
19
|
+
function scopeModes(authMode, scope) {
|
|
20
|
+
return {
|
|
21
|
+
wsGuard: scope.wsGuard.list.isEmpty ? "off" : authMode === "gateway" ? "env" : "header",
|
|
22
|
+
projectGuard: scope.projectGuard.list.isEmpty
|
|
23
|
+
? "off"
|
|
24
|
+
: authMode === "gateway"
|
|
25
|
+
? "env"
|
|
26
|
+
: "header",
|
|
27
|
+
defaults: {
|
|
28
|
+
ws: Boolean(scope.defaultWs),
|
|
29
|
+
project: Boolean(scope.defaultProject),
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
19
33
|
async function handleMcpRequest(req, res) {
|
|
20
34
|
const clientBearer = extractBearerToken(req.headers.authorization);
|
|
21
35
|
const authResult = authorizeHttpMcpRequest(clientBearer);
|
|
@@ -30,17 +44,16 @@ async function handleMcpRequest(req, res) {
|
|
|
30
44
|
? createPassthroughAuthResolver(authResult.otaskBearer)
|
|
31
45
|
: createEnvAuthResolver();
|
|
32
46
|
const authMode = getHttpAuthMode();
|
|
33
|
-
const
|
|
34
|
-
const guard = resolveHttpProjectGuard({
|
|
47
|
+
const scope = resolveHttpScope({
|
|
35
48
|
authMode,
|
|
36
49
|
env: process.env,
|
|
37
|
-
|
|
50
|
+
headers: req.headers,
|
|
38
51
|
});
|
|
39
52
|
const transport = new StreamableHTTPServerTransport({
|
|
40
53
|
sessionIdGenerator: undefined,
|
|
41
54
|
enableJsonResponse: true,
|
|
42
55
|
});
|
|
43
|
-
const server = createMcpServer(auth,
|
|
56
|
+
const server = createMcpServer(auth, scope);
|
|
44
57
|
res.on("close", () => {
|
|
45
58
|
void transport.close();
|
|
46
59
|
});
|
|
@@ -51,17 +64,19 @@ async function handleRequest(req, res) {
|
|
|
51
64
|
const requestUrl = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
52
65
|
if (requestUrl.pathname === "/health") {
|
|
53
66
|
const authMode = getHttpAuthMode();
|
|
54
|
-
const
|
|
55
|
-
const guard = resolveHttpProjectGuard({
|
|
67
|
+
const scope = resolveHttpScope({
|
|
56
68
|
authMode,
|
|
57
69
|
env: process.env,
|
|
58
|
-
|
|
70
|
+
headers: req.headers,
|
|
59
71
|
});
|
|
72
|
+
const modes = scopeModes(authMode, scope);
|
|
60
73
|
sendJson(res, 200, {
|
|
61
74
|
ok: true,
|
|
62
75
|
mode: "mcp-streamable-http",
|
|
63
76
|
authMode,
|
|
64
|
-
projectGuard:
|
|
77
|
+
projectGuard: modes.projectGuard,
|
|
78
|
+
wsGuard: modes.wsGuard,
|
|
79
|
+
defaults: modes.defaults,
|
|
65
80
|
});
|
|
66
81
|
return;
|
|
67
82
|
}
|
|
@@ -76,6 +91,7 @@ async function handleRequest(req, res) {
|
|
|
76
91
|
}
|
|
77
92
|
function main() {
|
|
78
93
|
validateHttpAuthConfig();
|
|
94
|
+
assertDefaultsAllowed(scopeFromEnv());
|
|
79
95
|
const port = getPort();
|
|
80
96
|
const host = process.env.HOST?.trim() || "0.0.0.0";
|
|
81
97
|
http
|
package/dist/mcp-http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-http.js","sourceRoot":"","sources":["../src/mcp-http.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"mcp-http.js","sourceRoot":"","sources":["../src/mcp-http.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas/task.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const WsTaskSlugSchema: z.ZodObject<{
|
|
3
|
-
ws_slug: z.ZodString
|
|
3
|
+
ws_slug: z.ZodOptional<z.ZodString>;
|
|
4
4
|
task_slug: z.ZodString;
|
|
5
5
|
}, "strict", z.ZodTypeAny, {
|
|
6
|
-
ws_slug: string;
|
|
7
6
|
task_slug: string;
|
|
7
|
+
ws_slug?: string | undefined;
|
|
8
8
|
}, {
|
|
9
|
-
ws_slug: string;
|
|
10
9
|
task_slug: string;
|
|
10
|
+
ws_slug?: string | undefined;
|
|
11
11
|
}>;
|
|
12
12
|
export declare const SubtaskSchema: z.ZodObject<{
|
|
13
13
|
id: z.ZodNullable<z.ZodNumber>;
|
|
@@ -39,7 +39,7 @@ export declare const FileSchema: z.ZodObject<{
|
|
|
39
39
|
temp_src: string;
|
|
40
40
|
}>;
|
|
41
41
|
export declare const UpdateTaskInputSchema: z.ZodObject<{
|
|
42
|
-
ws_slug: z.ZodString
|
|
42
|
+
ws_slug: z.ZodOptional<z.ZodString>;
|
|
43
43
|
task_slug: z.ZodString;
|
|
44
44
|
} & {
|
|
45
45
|
name: z.ZodOptional<z.ZodString>;
|
|
@@ -82,7 +82,6 @@ export declare const UpdateTaskInputSchema: z.ZodObject<{
|
|
|
82
82
|
}>, "many">>;
|
|
83
83
|
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
84
84
|
}, "strict", z.ZodTypeAny, {
|
|
85
|
-
ws_slug: string;
|
|
86
85
|
task_slug: string;
|
|
87
86
|
name?: string | undefined;
|
|
88
87
|
priority_id?: number | undefined;
|
|
@@ -104,9 +103,9 @@ export declare const UpdateTaskInputSchema: z.ZodObject<{
|
|
|
104
103
|
name: string;
|
|
105
104
|
temp_src: string;
|
|
106
105
|
}[] | undefined;
|
|
106
|
+
ws_slug?: string | undefined;
|
|
107
107
|
comment?: string | undefined;
|
|
108
108
|
}, {
|
|
109
|
-
ws_slug: string;
|
|
110
109
|
task_slug: string;
|
|
111
110
|
name?: string | undefined;
|
|
112
111
|
priority_id?: number | undefined;
|
|
@@ -128,41 +127,42 @@ export declare const UpdateTaskInputSchema: z.ZodObject<{
|
|
|
128
127
|
name: string;
|
|
129
128
|
temp_src: string;
|
|
130
129
|
}[] | undefined;
|
|
130
|
+
ws_slug?: string | undefined;
|
|
131
131
|
comment?: string | undefined;
|
|
132
132
|
}>;
|
|
133
133
|
export type UpdateTaskInput = z.infer<typeof UpdateTaskInputSchema>;
|
|
134
134
|
export declare const GetTaskInputSchema: z.ZodObject<{
|
|
135
|
-
ws_slug: z.ZodString
|
|
135
|
+
ws_slug: z.ZodOptional<z.ZodString>;
|
|
136
136
|
task_slug: z.ZodString;
|
|
137
137
|
}, "strict", z.ZodTypeAny, {
|
|
138
|
-
ws_slug: string;
|
|
139
138
|
task_slug: string;
|
|
139
|
+
ws_slug?: string | undefined;
|
|
140
140
|
}, {
|
|
141
|
-
ws_slug: string;
|
|
142
141
|
task_slug: string;
|
|
142
|
+
ws_slug?: string | undefined;
|
|
143
143
|
}>;
|
|
144
144
|
export type GetTaskInput = z.infer<typeof GetTaskInputSchema>;
|
|
145
145
|
export declare const MoveTaskInputSchema: z.ZodObject<{
|
|
146
|
-
ws_slug: z.ZodString
|
|
146
|
+
ws_slug: z.ZodOptional<z.ZodString>;
|
|
147
147
|
task_slug: z.ZodString;
|
|
148
148
|
} & {
|
|
149
149
|
board_column_id: z.ZodNumber;
|
|
150
150
|
board_id: z.ZodOptional<z.ZodNumber>;
|
|
151
151
|
}, "strict", z.ZodTypeAny, {
|
|
152
152
|
board_column_id: number;
|
|
153
|
-
ws_slug: string;
|
|
154
153
|
task_slug: string;
|
|
155
154
|
board_id?: number | undefined;
|
|
155
|
+
ws_slug?: string | undefined;
|
|
156
156
|
}, {
|
|
157
157
|
board_column_id: number;
|
|
158
|
-
ws_slug: string;
|
|
159
158
|
task_slug: string;
|
|
160
159
|
board_id?: number | undefined;
|
|
160
|
+
ws_slug?: string | undefined;
|
|
161
161
|
}>;
|
|
162
162
|
export type MoveTaskInput = z.infer<typeof MoveTaskInputSchema>;
|
|
163
163
|
export declare const CreateTaskInputSchema: z.ZodObject<{
|
|
164
|
-
ws_slug: z.ZodString
|
|
165
|
-
project_id: z.ZodNumber
|
|
164
|
+
ws_slug: z.ZodOptional<z.ZodString>;
|
|
165
|
+
project_id: z.ZodOptional<z.ZodNumber>;
|
|
166
166
|
name: z.ZodString;
|
|
167
167
|
board_id: z.ZodNumber;
|
|
168
168
|
board_column_id: z.ZodNumber;
|
|
@@ -175,66 +175,66 @@ export declare const CreateTaskInputSchema: z.ZodObject<{
|
|
|
175
175
|
}, "strict", z.ZodTypeAny, {
|
|
176
176
|
name: string;
|
|
177
177
|
end_at: string;
|
|
178
|
-
project_id: number;
|
|
179
178
|
board_id: number;
|
|
180
179
|
board_column_id: number;
|
|
181
|
-
ws_slug: string;
|
|
182
180
|
priority_id?: number | undefined;
|
|
183
181
|
description?: string | undefined;
|
|
182
|
+
project_id?: number | undefined;
|
|
184
183
|
performers?: string[] | undefined;
|
|
185
184
|
tags?: string[] | undefined;
|
|
185
|
+
ws_slug?: string | undefined;
|
|
186
186
|
comment?: string | undefined;
|
|
187
187
|
}, {
|
|
188
188
|
name: string;
|
|
189
189
|
end_at: string;
|
|
190
|
-
project_id: number;
|
|
191
190
|
board_id: number;
|
|
192
191
|
board_column_id: number;
|
|
193
|
-
ws_slug: string;
|
|
194
192
|
priority_id?: number | undefined;
|
|
195
193
|
description?: string | undefined;
|
|
194
|
+
project_id?: number | undefined;
|
|
196
195
|
performers?: string[] | undefined;
|
|
197
196
|
tags?: string[] | undefined;
|
|
197
|
+
ws_slug?: string | undefined;
|
|
198
198
|
comment?: string | undefined;
|
|
199
199
|
}>;
|
|
200
200
|
export type CreateTaskInput = z.infer<typeof CreateTaskInputSchema>;
|
|
201
201
|
export declare const ArchiveTaskInputSchema: z.ZodObject<{
|
|
202
|
-
ws_slug: z.ZodString
|
|
202
|
+
ws_slug: z.ZodOptional<z.ZodString>;
|
|
203
203
|
task_slug: z.ZodString;
|
|
204
204
|
}, "strict", z.ZodTypeAny, {
|
|
205
|
-
ws_slug: string;
|
|
206
205
|
task_slug: string;
|
|
206
|
+
ws_slug?: string | undefined;
|
|
207
207
|
}, {
|
|
208
|
-
ws_slug: string;
|
|
209
208
|
task_slug: string;
|
|
209
|
+
ws_slug?: string | undefined;
|
|
210
210
|
}>;
|
|
211
211
|
export type ArchiveTaskInput = z.infer<typeof ArchiveTaskInputSchema>;
|
|
212
212
|
export declare const ListCommentsInputSchema: z.ZodObject<{
|
|
213
|
-
ws_slug: z.ZodString
|
|
213
|
+
ws_slug: z.ZodOptional<z.ZodString>;
|
|
214
214
|
task_slug: z.ZodString;
|
|
215
215
|
}, "strict", z.ZodTypeAny, {
|
|
216
|
-
ws_slug: string;
|
|
217
216
|
task_slug: string;
|
|
217
|
+
ws_slug?: string | undefined;
|
|
218
218
|
}, {
|
|
219
|
-
ws_slug: string;
|
|
220
219
|
task_slug: string;
|
|
220
|
+
ws_slug?: string | undefined;
|
|
221
221
|
}>;
|
|
222
222
|
export type ListCommentsInput = z.infer<typeof ListCommentsInputSchema>;
|
|
223
223
|
export declare const AddCommentInputSchema: z.ZodObject<{
|
|
224
|
-
ws_slug: z.ZodString
|
|
224
|
+
ws_slug: z.ZodOptional<z.ZodString>;
|
|
225
225
|
task_slug: z.ZodString;
|
|
226
226
|
} & {
|
|
227
227
|
comment: z.ZodString;
|
|
228
228
|
parent_id: z.ZodOptional<z.ZodNumber>;
|
|
229
229
|
}, "strict", z.ZodTypeAny, {
|
|
230
|
-
ws_slug: string;
|
|
231
230
|
task_slug: string;
|
|
232
231
|
comment: string;
|
|
232
|
+
ws_slug?: string | undefined;
|
|
233
233
|
parent_id?: number | undefined;
|
|
234
234
|
}, {
|
|
235
|
-
ws_slug: string;
|
|
236
235
|
task_slug: string;
|
|
237
236
|
comment: string;
|
|
237
|
+
ws_slug?: string | undefined;
|
|
238
238
|
parent_id?: number | undefined;
|
|
239
239
|
}>;
|
|
240
240
|
export type AddCommentInput = z.infer<typeof AddCommentInputSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/schemas/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/schemas/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;;;;;;;EASlB,CAAC;AAEZ,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;EAQf,CAAC;AAEZ,eAAO,MAAM,UAAU;;;;;;;;;EAKZ,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,kBAAkB;;;;;;;;;EAAmB,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;EAGrB,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,sBAAsB;;;;;;;;;EAAmB,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,uBAAuB;;;;;;;;;EAAmB,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;EAGvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
package/dist/schemas/task.js
CHANGED
|
@@ -4,11 +4,9 @@ export const WsTaskSlugSchema = z
|
|
|
4
4
|
ws_slug: z
|
|
5
5
|
.string()
|
|
6
6
|
.min(1)
|
|
7
|
-
.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
.min(1)
|
|
11
|
-
.describe("Task slug (UUID from panel.otask.ru URL)"),
|
|
7
|
+
.optional()
|
|
8
|
+
.describe("Workspace slug (UUID from panel.otask.ru). Optional if OTASK_DEFAULT_WS is set."),
|
|
9
|
+
task_slug: z.string().min(1).describe("Task slug (UUID from panel.otask.ru URL)"),
|
|
12
10
|
})
|
|
13
11
|
.strict();
|
|
14
12
|
export const SubtaskSchema = z
|
|
@@ -37,10 +35,7 @@ export const UpdateTaskInputSchema = WsTaskSlugSchema.extend({
|
|
|
37
35
|
description: z.string().optional().describe("Task description (HTML allowed)"),
|
|
38
36
|
end_at: z.string().optional().describe("Due date (ISO 8601)"),
|
|
39
37
|
files: z.array(FileSchema).optional().describe("Attached files"),
|
|
40
|
-
performers: z
|
|
41
|
-
.array(z.string())
|
|
42
|
-
.optional()
|
|
43
|
-
.describe("Performer IDs as strings"),
|
|
38
|
+
performers: z.array(z.string()).optional().describe("Performer IDs as strings"),
|
|
44
39
|
priority_id: z.number().int().optional().describe("Priority ID"),
|
|
45
40
|
project_id: z.number().int().optional().describe("Project ID"),
|
|
46
41
|
subtasks: z.array(SubtaskSchema).optional(),
|
|
@@ -49,36 +44,28 @@ export const UpdateTaskInputSchema = WsTaskSlugSchema.extend({
|
|
|
49
44
|
export const GetTaskInputSchema = WsTaskSlugSchema;
|
|
50
45
|
export const MoveTaskInputSchema = WsTaskSlugSchema.extend({
|
|
51
46
|
board_column_id: z.number().int().describe("Target column/status ID"),
|
|
52
|
-
board_id: z
|
|
53
|
-
.number()
|
|
54
|
-
.int()
|
|
55
|
-
.optional()
|
|
56
|
-
.describe("Target board ID if changing board"),
|
|
47
|
+
board_id: z.number().int().optional().describe("Target board ID if changing board"),
|
|
57
48
|
}).strict();
|
|
58
49
|
export const CreateTaskInputSchema = z
|
|
59
50
|
.object({
|
|
60
51
|
ws_slug: z
|
|
61
52
|
.string()
|
|
62
53
|
.min(1)
|
|
63
|
-
.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
board_id: z
|
|
67
|
-
.number()
|
|
68
|
-
.int()
|
|
69
|
-
.describe("Board ID — discover via otask_list_board"),
|
|
70
|
-
board_column_id: z
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Workspace slug. Optional if OTASK_DEFAULT_WS is set."),
|
|
56
|
+
project_id: z
|
|
71
57
|
.number()
|
|
72
58
|
.int()
|
|
73
|
-
.
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Project ID (must be allow-listed). Optional if OTASK_DEFAULT_PROJECT is set."),
|
|
61
|
+
name: z.string().min(1).describe("Task title"),
|
|
62
|
+
board_id: z.number().int().describe("Board ID — discover via otask_list_board"),
|
|
63
|
+
board_column_id: z.number().int().describe("Column ID — discover via otask_list_board"),
|
|
74
64
|
end_at: z.string().describe("Due date (ISO 8601)"),
|
|
75
65
|
comment: z.string().optional(),
|
|
76
66
|
description: z.string().optional(),
|
|
77
67
|
priority_id: z.number().int().optional(),
|
|
78
|
-
performers: z
|
|
79
|
-
.array(z.string())
|
|
80
|
-
.optional()
|
|
81
|
-
.describe("Performer IDs as strings"),
|
|
68
|
+
performers: z.array(z.string()).optional().describe("Performer IDs as strings"),
|
|
82
69
|
tags: z.array(z.string()).optional().describe("Tag IDs as strings"),
|
|
83
70
|
})
|
|
84
71
|
.strict();
|
|
@@ -86,10 +73,6 @@ export const ArchiveTaskInputSchema = WsTaskSlugSchema;
|
|
|
86
73
|
export const ListCommentsInputSchema = WsTaskSlugSchema;
|
|
87
74
|
export const AddCommentInputSchema = WsTaskSlugSchema.extend({
|
|
88
75
|
comment: z.string().min(1).describe("Comment body"),
|
|
89
|
-
parent_id: z
|
|
90
|
-
.number()
|
|
91
|
-
.int()
|
|
92
|
-
.optional()
|
|
93
|
-
.describe("Parent comment ID for replies"),
|
|
76
|
+
parent_id: z.number().int().optional().describe("Parent comment ID for replies"),
|
|
94
77
|
}).strict();
|
|
95
78
|
//# sourceMappingURL=task.js.map
|
package/dist/schemas/task.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/schemas/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/schemas/task.ts"],"names":[],"mappings":"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"}
|