dokutrak-mcp 0.1.0 → 0.1.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/CHANGELOG.md +36 -0
- package/README.md +62 -6
- package/dist/cli.js +10 -4
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,40 @@ All notable changes to `dokutrak-mcp` are recorded here. The format follows
|
|
|
6
6
|
is part of the public contract: it changes only with a decision recorded in
|
|
7
7
|
the DokuTrak product repository, and every such change is listed here.
|
|
8
8
|
|
|
9
|
+
## [Unreleased]
|
|
10
|
+
|
|
11
|
+
## [0.1.2] — 2026-10-14
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- The hosted connector, `https://app.dokutrak.com/api/mcp`, listed as a
|
|
16
|
+
remote in the MCP Registry entry next to the npm package. It is operated by
|
|
17
|
+
the DokuTrak service (OAuth, prepare / confirm / send / track) and is not
|
|
18
|
+
part of this package; see the README.
|
|
19
|
+
- An MCP Bundle, `dokutrak.mcpb`: one-click install in Claude Desktop, the
|
|
20
|
+
Agent Connection asked for at install and stored as a sensitive setting.
|
|
21
|
+
`npm run bundle` builds it (`mcpb/manifest.json`, dependencies inlined in
|
|
22
|
+
one file), checks it against the running server and packs it; the release
|
|
23
|
+
workflow attaches it to each GitHub release. The npm package is unchanged.
|
|
24
|
+
- A Privacy Policy section in the README.
|
|
25
|
+
|
|
26
|
+
## [0.1.1] — 2026-09-23
|
|
27
|
+
|
|
28
|
+
Decision recorded in the DokuTrak product repository: ADR-014, amendment of
|
|
29
|
+
2026-09-23 (dokutrak-product#577).
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- `create_request` asks before it sends. Its description tells the agent to
|
|
34
|
+
show the Professional the recipient email, the deadline, each document and
|
|
35
|
+
the message, and to call only once they have confirmed. The tool is now
|
|
36
|
+
annotated `destructiveHint: true` and `openWorldHint: true`, and carries
|
|
37
|
+
`_meta["anthropic/requiresUserInteraction"]: true`, so Claude Desktop and
|
|
38
|
+
Claude Code ask the Professional before every call.
|
|
39
|
+
- `request_replacement` says that no immediate email to the Client exists,
|
|
40
|
+
not even from the dashboard. An agent had told a Professional otherwise.
|
|
41
|
+
- The install skill asks for the message as well, and asks every time.
|
|
42
|
+
|
|
9
43
|
## [0.1.0] — 2026-09-14
|
|
10
44
|
|
|
11
45
|
First public release. One complete round trip — ask, chase, know, collect —
|
|
@@ -38,4 +72,6 @@ as decided in ADR-014 of the DokuTrak product repository.
|
|
|
38
72
|
management: the service refuses them to every Agent Connection, whatever
|
|
39
73
|
the connector.
|
|
40
74
|
|
|
75
|
+
[0.1.2]: https://github.com/Crackx17/dokutrak-mcp/releases/tag/v0.1.2
|
|
76
|
+
[0.1.1]: https://github.com/Crackx17/dokutrak-mcp/releases/tag/v0.1.1
|
|
41
77
|
[0.1.0]: https://github.com/Crackx17/dokutrak-mcp/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -22,7 +22,19 @@ configuration with your key already in place; the instructions below are the sam
|
|
|
22
22
|
The key is read from the environment variable `DOKUTRAK_API_KEY`. It is never taken from the
|
|
23
23
|
command line.
|
|
24
24
|
|
|
25
|
-
### Claude Desktop
|
|
25
|
+
### Install in Claude Desktop (one click)
|
|
26
|
+
|
|
27
|
+
1. Download [`dokutrak.mcpb`](https://github.com/Crackx17/dokutrak-mcp/releases/latest/download/dokutrak.mcpb),
|
|
28
|
+
the connector packaged as an [MCP Bundle](https://github.com/modelcontextprotocol/mcpb).
|
|
29
|
+
2. Double-click it, or drag it onto Claude Desktop (**Settings → Extensions**).
|
|
30
|
+
3. Click **Install** and paste your Agent Connection key when asked. Claude Desktop masks it, stores it
|
|
31
|
+
securely and passes it to the connector as `DOKUTRAK_API_KEY`.
|
|
32
|
+
|
|
33
|
+
The bundle carries its own copy of the connector and runs on the Node.js built into Claude
|
|
34
|
+
Desktop: no `npx`, no configuration file to edit. `npm run bundle` builds the same file from a
|
|
35
|
+
clone.
|
|
36
|
+
|
|
37
|
+
### Claude Desktop, by hand
|
|
26
38
|
|
|
27
39
|
Open the configuration file:
|
|
28
40
|
|
|
@@ -53,11 +65,13 @@ claude mcp add dokutrak -e DOKUTRAK_API_KEY=dk_live_… -- npx -y dokutrak-mcp
|
|
|
53
65
|
|
|
54
66
|
Then `/mcp` inside Claude Code lists `dokutrak` and its tools.
|
|
55
67
|
|
|
56
|
-
### claude.ai
|
|
68
|
+
### claude.ai and ChatGPT (hosted)
|
|
57
69
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
70
|
+
Add `https://app.dokutrak.com/api/mcp` as a custom connector. You sign in to DokuTrak
|
|
71
|
+
(or create an account) during the OAuth step. The hosted connector prepares a request,
|
|
72
|
+
sends it only after you confirm it in DokuTrak, and tracks progress. It never returns
|
|
73
|
+
file content. Downloading files stays with this local connector. Setup:
|
|
74
|
+
[dokutrak.com/connectors](https://dokutrak.com/connectors).
|
|
61
75
|
|
|
62
76
|
### From a clone, before the npm release
|
|
63
77
|
|
|
@@ -83,6 +97,18 @@ Then point the client at the built file instead of `npx`:
|
|
|
83
97
|
|
|
84
98
|
or, for Claude Code: `claude mcp add dokutrak -e DOKUTRAK_API_KEY=dk_live_… -- node /path/to/dokutrak-mcp/dist/cli.js`.
|
|
85
99
|
|
|
100
|
+
### The skill
|
|
101
|
+
|
|
102
|
+
`skills/dokutrak/SKILL.md` teaches the agent the three everyday uses — ask a Client for
|
|
103
|
+
documents, know where a request stands, chase on rejected files — and how to connect. It is
|
|
104
|
+
what a DokuTrak user installs alongside the connector:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npx skills add Crackx17/dokutrak-mcp # the open agent-skills installer
|
|
108
|
+
# or by hand, for Claude Code / Claude Desktop:
|
|
109
|
+
cp -r skills/dokutrak ~/.claude/skills/dokutrak
|
|
110
|
+
```
|
|
111
|
+
|
|
86
112
|
## Configuration
|
|
87
113
|
|
|
88
114
|
| Variable | Required | Default | Meaning |
|
|
@@ -103,11 +129,19 @@ and to nobody else; the client uploads through the secure link it contains. Unde
|
|
|
103
129
|
is the same two-step the DokuTrak app performs: create with `sendEmail: false`, then send. If the
|
|
104
130
|
send fails, the error names the created request, which stays visible in the dashboard.
|
|
105
131
|
|
|
132
|
+
**Nothing goes out without your yes.** The email to a real client cannot be recalled, so the tool
|
|
133
|
+
tells the agent to show you the recipient, the deadline, the checklist and the message, and to
|
|
134
|
+
wait for your confirmation. The tool is also flagged so that the client asks you before every
|
|
135
|
+
call: Claude Code prompts each time, even in auto or bypass mode, and Claude Desktop treats it as
|
|
136
|
+
a tool that always needs approval. A client that ignores these flags is left with the
|
|
137
|
+
instruction to the agent alone.
|
|
138
|
+
|
|
106
139
|
### `request_replacement`
|
|
107
140
|
|
|
108
141
|
Chases the client on the rejected files of a request: flags them, moves the request back to
|
|
109
142
|
awaiting the client, and returns it to the automatic reminder cadence. **This call sends no
|
|
110
|
-
email by itself**; the reminders do
|
|
143
|
+
email by itself**; the reminders do, and DokuTrak has no way to email the client immediately,
|
|
144
|
+
not even from the dashboard. The optional message is recorded in the request's audit
|
|
111
145
|
trail and is not sent to the client. It refuses a request with no rejected file.
|
|
112
146
|
|
|
113
147
|
### `get_request`
|
|
@@ -135,6 +169,19 @@ connector asks. The same goes for billing, workspace settings and the management
|
|
|
135
169
|
Revoking the Agent Connection in DokuTrak takes effect on the very next call: the connector
|
|
136
170
|
answers with the service's 401 and nothing else.
|
|
137
171
|
|
|
172
|
+
## Privacy Policy
|
|
173
|
+
|
|
174
|
+
The connector runs on your machine and talks to one service only: the DokuTrak API
|
|
175
|
+
(`https://app.dokutrak.com/api`, or the URL you set in `DOKUTRAK_API_URL`), with the Agent
|
|
176
|
+
Connection you configured. It sends what the tools need (the request you create, the id or
|
|
177
|
+
search term you look up) and relays the answers to your agent. It writes nothing to disk, keeps
|
|
178
|
+
no cache or log, and sends no telemetry or analytics to DokuTrak or to anyone else.
|
|
179
|
+
|
|
180
|
+
Everything it sends is processed by DokuTrak under the [DokuTrak Privacy
|
|
181
|
+
Policy](https://dokutrak.com/privacy), which covers what is collected, how it is used and
|
|
182
|
+
stored, the subprocessors it is shared with, retention and deletion, and your rights. Questions:
|
|
183
|
+
arthur@dokutrak.com; security issues: security@dokutrak.com.
|
|
184
|
+
|
|
138
185
|
## Development
|
|
139
186
|
|
|
140
187
|
```bash
|
|
@@ -163,6 +210,15 @@ DOKUTRAK_API_KEY=dk_live_… STAGING_RECIPIENT_EMAIL=you@example.com npm run sta
|
|
|
163
210
|
A real Document Request is created and a real email goes to `STAGING_RECIPIENT_EMAIL`. The
|
|
164
211
|
transcript lands in `staging-run-<timestamp>.md` (git-ignored); the key is never written to it.
|
|
165
212
|
|
|
213
|
+
### The MCP Bundle
|
|
214
|
+
|
|
215
|
+
`npm run bundle` builds `mcpb/server/index.cjs` (the connector with every dependency inlined),
|
|
216
|
+
starts it and checks that it lists exactly the tools declared in `mcpb/manifest.json` at the
|
|
217
|
+
version of `package.json`, then validates the manifest and packs `dokutrak.mcpb` with the
|
|
218
|
+
official [`mcpb`](https://github.com/modelcontextprotocol/mcpb) CLI. CI runs it on every pull
|
|
219
|
+
request, and the release workflow attaches `dokutrak.mcpb` to the GitHub release of each tag.
|
|
220
|
+
A change to the tool surface or the version updates `mcpb/manifest.json` too.
|
|
221
|
+
|
|
166
222
|
### Releasing
|
|
167
223
|
|
|
168
224
|
A tag `vX.Y.Z` matching `package.json` and `SERVER_VERSION` triggers `.github/workflows/release.yml`:
|
package/dist/cli.js
CHANGED
|
@@ -132,7 +132,7 @@ function jsonResult(value) {
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
// src/tools/create-request.ts
|
|
135
|
-
var CREATE_REQUEST_DESCRIPTION = "Call this when the Professional wants to ask a Client for documents: it creates the Document Request and
|
|
135
|
+
var CREATE_REQUEST_DESCRIPTION = "Call this when the Professional wants to ask a Client for documents: it creates the Document Request and emails the Client in one step, and that email cannot be recalled. Before calling, show the Professional the recipient email, the deadline, each document as the Client will read it, and the message if there is one, then call only once they have confirmed, even when the request already looks complete. The email goes to the recipient given here and to nobody else, and the Client uploads through the secure link it contains. If the email fails after creation, the error names the created request so it can be sent from the dashboard.";
|
|
136
136
|
var registerCreateRequest = (server, api) => {
|
|
137
137
|
server.registerTool(
|
|
138
138
|
"create_request",
|
|
@@ -154,7 +154,13 @@ var registerCreateRequest = (server, api) => {
|
|
|
154
154
|
})
|
|
155
155
|
).min(1).describe("The checklist the Client must fill.")
|
|
156
156
|
},
|
|
157
|
-
|
|
157
|
+
// An email to a real Client cannot be recalled, so the client asks the
|
|
158
|
+
// Professional on every call rather than trusting the description alone
|
|
159
|
+
// (dokutrak-product#577, ADR-014 amendment of 2026-09-23). Claude Desktop
|
|
160
|
+
// always prompts for a destructive tool; Claude Code prompts on every call
|
|
161
|
+
// for this key, auto and bypass modes included.
|
|
162
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
|
|
163
|
+
_meta: { "anthropic/requiresUserInteraction": true }
|
|
158
164
|
},
|
|
159
165
|
(input) => runTool(async () => {
|
|
160
166
|
const created = await api.post("/v1/requests", {
|
|
@@ -198,7 +204,7 @@ function toDeadlineIso(deadline) {
|
|
|
198
204
|
|
|
199
205
|
// src/tools/request-replacement.ts
|
|
200
206
|
import { z as z2 } from "zod";
|
|
201
|
-
var REQUEST_REPLACEMENT_DESCRIPTION = "Call this when a Document Request has rejected files and the Professional wants the Client to send them again. It flags every rejected file, moves the request back to awaiting the Client, and returns it to the automatic reminder cadence, which is what reaches the Client. Nothing is emailed by this call
|
|
207
|
+
var REQUEST_REPLACEMENT_DESCRIPTION = "Call this when a Document Request has rejected files and the Professional wants the Client to send them again. It flags every rejected file, moves the request back to awaiting the Client, and returns it to the automatic reminder cadence, which is what reaches the Client. Nothing is emailed by this call and there is no way to email the Client immediately, not even from the dashboard; the optional message is kept in the audit trail rather than sent. Do not use it on a request with no rejected file; get_request shows which files were rejected.";
|
|
202
208
|
var registerRequestReplacement = (server, api) => {
|
|
203
209
|
server.registerTool(
|
|
204
210
|
"request_replacement",
|
|
@@ -384,7 +390,7 @@ var TOOL_REGISTRARS = [
|
|
|
384
390
|
|
|
385
391
|
// src/server.ts
|
|
386
392
|
var SERVER_NAME = "dokutrak";
|
|
387
|
-
var SERVER_VERSION = "0.1.
|
|
393
|
+
var SERVER_VERSION = "0.1.2";
|
|
388
394
|
function createServer(options) {
|
|
389
395
|
const api = createApiClient({
|
|
390
396
|
baseUrl: options.baseUrl,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dokutrak-mcp",
|
|
3
3
|
"mcpName": "io.github.Crackx17/dokutrak-mcp",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.2",
|
|
5
5
|
"description": "MCP connector for DokuTrak: let your agent chase the documents.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"test": "vitest run",
|
|
24
24
|
"check": "npm run typecheck && npm run build && npm test",
|
|
25
25
|
"prepublishOnly": "npm run check",
|
|
26
|
-
"staging": "node scripts/staging-run.mjs"
|
|
26
|
+
"staging": "node scripts/staging-run.mjs",
|
|
27
|
+
"bundle": "tsup --config tsup.mcpb.config.ts && node scripts/check-bundle-manifest.mjs && npx --yes @anthropic-ai/mcpb@2.1.2 validate mcpb/manifest.json && npx --yes @anthropic-ai/mcpb@2.1.2 pack mcpb dokutrak.mcpb"
|
|
27
28
|
},
|
|
28
29
|
"repository": {
|
|
29
30
|
"type": "git",
|