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 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
- **Not supported in this release.** claude.ai connects to remote MCP servers over HTTP with
59
- OAuth; this connector speaks stdio with an API key, which is what a local install into Claude
60
- Desktop or Claude Code needs. A hosted variant is a separate, later decision.
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. The optional message is recorded in the request's audit
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 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.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.0",
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",