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 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. The optional message is recorded in the request's audit
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 sends the email in one step, so nothing is left created but unsent. Provide the Client email, a deadline, and the list of documents wanted, plus an optional title and a message written by the Professional. 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.";
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
- annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }
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 itself, and 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.";
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.0";
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dokutrak-mcp",
3
3
  "mcpName": "io.github.Crackx17/dokutrak-mcp",
4
- "version": "0.1.0",
4
+ "version": "0.1.1",
5
5
  "description": "MCP connector for DokuTrak: let your agent chase the documents.",
6
6
  "license": "MIT",
7
7
  "type": "module",