dokutrak-mcp 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +21 -1
- package/dist/cli.js +10 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,23 @@ 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
|
+
## [0.1.1] — 2026-09-23
|
|
10
|
+
|
|
11
|
+
Decision recorded in the DokuTrak product repository: ADR-014, amendment of
|
|
12
|
+
2026-09-23 (dokutrak-product#577).
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- `create_request` asks before it sends. Its description tells the agent to
|
|
17
|
+
show the Professional the recipient email, the deadline, each document and
|
|
18
|
+
the message, and to call only once they have confirmed. The tool is now
|
|
19
|
+
annotated `destructiveHint: true` and `openWorldHint: true`, and carries
|
|
20
|
+
`_meta["anthropic/requiresUserInteraction"]: true`, so Claude Desktop and
|
|
21
|
+
Claude Code ask the Professional before every call.
|
|
22
|
+
- `request_replacement` says that no immediate email to the Client exists,
|
|
23
|
+
not even from the dashboard. An agent had told a Professional otherwise.
|
|
24
|
+
- The install skill asks for the message as well, and asks every time.
|
|
25
|
+
|
|
9
26
|
## [0.1.0] — 2026-09-14
|
|
10
27
|
|
|
11
28
|
First public release. One complete round trip — ask, chase, know, collect —
|
|
@@ -38,4 +55,5 @@ as decided in ADR-014 of the DokuTrak product repository.
|
|
|
38
55
|
management: the service refuses them to every Agent Connection, whatever
|
|
39
56
|
the connector.
|
|
40
57
|
|
|
58
|
+
[0.1.1]: https://github.com/Crackx17/dokutrak-mcp/releases/tag/v0.1.1
|
|
41
59
|
[0.1.0]: https://github.com/Crackx17/dokutrak-mcp/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -83,6 +83,18 @@ Then point the client at the built file instead of `npx`:
|
|
|
83
83
|
|
|
84
84
|
or, for Claude Code: `claude mcp add dokutrak -e DOKUTRAK_API_KEY=dk_live_… -- node /path/to/dokutrak-mcp/dist/cli.js`.
|
|
85
85
|
|
|
86
|
+
### The skill
|
|
87
|
+
|
|
88
|
+
`skills/dokutrak/SKILL.md` teaches the agent the three everyday uses — ask a Client for
|
|
89
|
+
documents, know where a request stands, chase on rejected files — and how to connect. It is
|
|
90
|
+
what a DokuTrak user installs alongside the connector:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npx skills add Crackx17/dokutrak-mcp # the open agent-skills installer
|
|
94
|
+
# or by hand, for Claude Code / Claude Desktop:
|
|
95
|
+
cp -r skills/dokutrak ~/.claude/skills/dokutrak
|
|
96
|
+
```
|
|
97
|
+
|
|
86
98
|
## Configuration
|
|
87
99
|
|
|
88
100
|
| Variable | Required | Default | Meaning |
|
|
@@ -103,11 +115,19 @@ and to nobody else; the client uploads through the secure link it contains. Unde
|
|
|
103
115
|
is the same two-step the DokuTrak app performs: create with `sendEmail: false`, then send. If the
|
|
104
116
|
send fails, the error names the created request, which stays visible in the dashboard.
|
|
105
117
|
|
|
118
|
+
**Nothing goes out without your yes.** The email to a real client cannot be recalled, so the tool
|
|
119
|
+
tells the agent to show you the recipient, the deadline, the checklist and the message, and to
|
|
120
|
+
wait for your confirmation. The tool is also flagged so that the client asks you before every
|
|
121
|
+
call: Claude Code prompts each time, even in auto or bypass mode, and Claude Desktop treats it as
|
|
122
|
+
a tool that always needs approval. A client that ignores these flags is left with the
|
|
123
|
+
instruction to the agent alone.
|
|
124
|
+
|
|
106
125
|
### `request_replacement`
|
|
107
126
|
|
|
108
127
|
Chases the client on the rejected files of a request: flags them, moves the request back to
|
|
109
128
|
awaiting the client, and returns it to the automatic reminder cadence. **This call sends no
|
|
110
|
-
email by itself**; the reminders do
|
|
129
|
+
email by itself**; the reminders do, and DokuTrak has no way to email the client immediately,
|
|
130
|
+
not even from the dashboard. The optional message is recorded in the request's audit
|
|
111
131
|
trail and is not sent to the client. It refuses a request with no rejected file.
|
|
112
132
|
|
|
113
133
|
### `get_request`
|
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.1";
|
|
388
394
|
function createServer(options) {
|
|
389
395
|
const api = createApiClient({
|
|
390
396
|
baseUrl: options.baseUrl,
|
package/package.json
CHANGED