@dain-os/mcp-server 0.1.0 → 0.2.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 +128 -127
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +20 -2
- package/dist/client.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/tools/developer.d.ts +3 -0
- package/dist/tools/developer.d.ts.map +1 -0
- package/dist/tools/developer.js +182 -0
- package/dist/tools/developer.js.map +1 -0
- package/dist/tools/index.d.ts +3 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.js +30 -14
- package/dist/tools/types.js.map +1 -1
- package/package.json +35 -34
package/README.md
CHANGED
|
@@ -1,127 +1,128 @@
|
|
|
1
|
-
# @dain-os/mcp-server
|
|
2
|
-
|
|
3
|
-
MCP server for DainOS. Lets Claude Code and other MCP clients manage your projects, tasks, and task comments
|
|
4
|
-
|
|
5
|
-
## What it does
|
|
6
|
-
|
|
7
|
-
Wraps the DainOS Express API behind
|
|
8
|
-
|
|
9
|
-
| Domain | Tools |
|
|
10
|
-
|---|---|
|
|
11
|
-
| Projects | `list_projects`, `get_project`, `create_project`, `update_project`, `archive_project` |
|
|
12
|
-
| Tasks | `list_tasks`, `get_task`, `create_task`, `update_task`, `complete_task`, `archive_task` |
|
|
13
|
-
| Comments | `add_task_comment` |
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
| `
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
- "
|
|
72
|
-
- "
|
|
73
|
-
- "
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
npm
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
|
|
114
|
-
"
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
1
|
+
# @dain-os/mcp-server
|
|
2
|
+
|
|
3
|
+
MCP server for DainOS. Lets Claude Code and other MCP clients manage your projects, tasks, and task comments, and persist + retrieve developer knowledge (changelog / sessions / KB).
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
Wraps the DainOS Express API behind 17 tools:
|
|
8
|
+
|
|
9
|
+
| Domain | Tools |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Projects | `list_projects`, `get_project`, `create_project`, `update_project`, `archive_project` |
|
|
12
|
+
| Tasks | `list_tasks`, `get_task`, `create_task`, `update_task`, `complete_task`, `archive_task` |
|
|
13
|
+
| Comments | `add_task_comment` |
|
|
14
|
+
| Developer KB (v0.2+) | `log_changelog_entry`, `log_session_context`, `log_knowledge_base_entry`, `list_recent_sessions`, `search_knowledge_base` |
|
|
15
|
+
|
|
16
|
+
Project / task / comment tools run as the user who minted the token, with tenant scoping enforced server-side. Developer KB tools are intentionally cross-tenant: they accept `project` as a required parameter and store entries in a shared developer schema (used by `/wrapup`, `/recap`, `/dev-kb`).
|
|
17
|
+
|
|
18
|
+
## Setup
|
|
19
|
+
|
|
20
|
+
### 1. Mint a personal access token
|
|
21
|
+
|
|
22
|
+
Sign in to DainOS, go to **Settings -> API tokens**, click **New token**, give it a name (e.g. `claude-code-laptop`), and copy the value. The raw token is shown exactly once.
|
|
23
|
+
|
|
24
|
+
Tokens look like `dain_pat_<43 base64url chars>`.
|
|
25
|
+
|
|
26
|
+
### 2. Add the server to your MCP client
|
|
27
|
+
|
|
28
|
+
#### Claude Code
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
claude mcp add dainos -- npx -y @dain-os/mcp-server
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Then set the token in your environment (or pass it inline):
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
export DAINOS_API_TOKEN=dain_pat_<your token>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Or, for one-machine setup, add it to your Claude Code config directly:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"mcpServers": {
|
|
45
|
+
"dainos": {
|
|
46
|
+
"command": "npx",
|
|
47
|
+
"args": ["-y", "@dain-os/mcp-server"],
|
|
48
|
+
"env": {
|
|
49
|
+
"DAINOS_API_TOKEN": "dain_pat_<your token>"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 3. Restart your MCP client
|
|
57
|
+
|
|
58
|
+
Claude Code picks up new MCP servers on restart.
|
|
59
|
+
|
|
60
|
+
## Environment
|
|
61
|
+
|
|
62
|
+
| Variable | Required | Default | Notes |
|
|
63
|
+
|---|---|---|---|
|
|
64
|
+
| `DAINOS_API_TOKEN` | yes | n/a | Personal access token from `/settings/api-tokens` |
|
|
65
|
+
| `DAINOS_API_URL` | no | `https://api.dainos.app` | Override for local dev or staging |
|
|
66
|
+
|
|
67
|
+
## Usage examples
|
|
68
|
+
|
|
69
|
+
Once connected, ask Claude Code things like:
|
|
70
|
+
|
|
71
|
+
- "List my active projects in DainOS."
|
|
72
|
+
- "What tasks are assigned to me?"
|
|
73
|
+
- "Create a task on the Portunus project called 'wire up the new sidebar' due Friday."
|
|
74
|
+
- "Mark that task complete and add a comment that the PR is #312."
|
|
75
|
+
|
|
76
|
+
The model uses `list_projects` to find ids, `create_task` / `update_task` / `complete_task` to mutate state, and `add_task_comment` for follow-ups.
|
|
77
|
+
|
|
78
|
+
## Troubleshooting
|
|
79
|
+
|
|
80
|
+
### 401 Unauthorized
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
DainOS rejected the token (401). Mint a new one at https://dainos.app/settings/api-tokens
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The token is revoked, expired, or never existed. Visit Settings -> API tokens, mint a new one, and update your MCP config.
|
|
87
|
+
|
|
88
|
+
### 403 Forbidden
|
|
89
|
+
|
|
90
|
+
The token is valid but your account does not have permission for the operation (e.g. archiving a project you do not own).
|
|
91
|
+
|
|
92
|
+
### Tool is not visible to Claude Code
|
|
93
|
+
|
|
94
|
+
Restart Claude Code after `claude mcp add ...`. MCP servers are loaded once at startup.
|
|
95
|
+
|
|
96
|
+
## Local development
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
git clone https://github.com/dain-agency/dain-os
|
|
100
|
+
cd dain-os/packages/mcp-server
|
|
101
|
+
npm install
|
|
102
|
+
npm run build
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Then point your MCP client at the local build:
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"mcpServers": {
|
|
110
|
+
"dainos-local": {
|
|
111
|
+
"command": "node",
|
|
112
|
+
"args": ["/path/to/dain-os/packages/mcp-server/dist/index.js"],
|
|
113
|
+
"env": {
|
|
114
|
+
"DAINOS_API_TOKEN": "dain_pat_...",
|
|
115
|
+
"DAINOS_API_URL": "http://localhost:3001"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Why a small tool surface
|
|
123
|
+
|
|
124
|
+
The Notion MCP works well because it exposes a focused, opinionated set of operations rather than a one-to-one mirror of every API endpoint. The DainOS MCP server follows the same principle: project and task work covers the bulk of the day-to-day "keep things updated" use case, and the model picks the right verb every time. Tools for time entries, deals, proposals, and attachments are tracked for follow-up versions.
|
|
125
|
+
|
|
126
|
+
## Licence
|
|
127
|
+
|
|
128
|
+
Proprietary. Internal use by Dain only.
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAM3D;AASD,qBAAa,YAAY;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM;IAOtD;;;;;OAKG;IACG,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,EACnD,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAmDb,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlD,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAGpC"}
|
package/dist/client.js
CHANGED
|
@@ -11,6 +11,12 @@
|
|
|
11
11
|
* tells the user exactly where to mint a new token.
|
|
12
12
|
*/
|
|
13
13
|
const DEFAULT_API_URL = 'https://api.dainos.app';
|
|
14
|
+
/**
|
|
15
|
+
* Per-request timeout. If the API hangs we want the MCP server to surface a
|
|
16
|
+
* clear error to the model rather than block indefinitely with no feedback.
|
|
17
|
+
* 30s is generous for any of the operations we expose (single CRUD calls).
|
|
18
|
+
*/
|
|
19
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
14
20
|
export class DainOsApiError extends Error {
|
|
15
21
|
status;
|
|
16
22
|
body;
|
|
@@ -25,7 +31,9 @@ export class DainOsClient {
|
|
|
25
31
|
baseUrl;
|
|
26
32
|
token;
|
|
27
33
|
constructor(baseUrl, token) {
|
|
28
|
-
|
|
34
|
+
// Strip trailing slashes so we never end up with `https://host//api/v1/...`,
|
|
35
|
+
// which some Express routers treat as a 404.
|
|
36
|
+
this.baseUrl = (baseUrl ?? DEFAULT_API_URL).replace(/\/+$/, '');
|
|
29
37
|
this.token = token;
|
|
30
38
|
}
|
|
31
39
|
/**
|
|
@@ -43,11 +51,21 @@ export class DainOsClient {
|
|
|
43
51
|
'Content-Type': 'application/json',
|
|
44
52
|
Accept: 'application/json',
|
|
45
53
|
},
|
|
54
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
46
55
|
};
|
|
47
56
|
if (body !== undefined) {
|
|
48
57
|
init.body = JSON.stringify(body);
|
|
49
58
|
}
|
|
50
|
-
|
|
59
|
+
let response;
|
|
60
|
+
try {
|
|
61
|
+
response = await fetch(url, init);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error instanceof DOMException && error.name === 'TimeoutError') {
|
|
65
|
+
throw new DainOsApiError(0, '', `DainOS request timed out after ${REQUEST_TIMEOUT_MS / 1000}s. The API may be unreachable; check DAINOS_API_URL or your network.`);
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
51
69
|
if (response.status === 204) {
|
|
52
70
|
return undefined;
|
|
53
71
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAEjD,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,MAAM,CAAS;IACf,IAAI,CAAS;IAEtB,YAAY,MAAc,EAAE,IAAY,EAAE,OAAgB;QACxD,KAAK,CAAC,OAAO,IAAI,uBAAuB,MAAM,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AASD,MAAM,OAAO,YAAY;IACd,OAAO,CAAS;IAChB,KAAK,CAAS;IAEvB,YAAY,OAA2B,EAAE,KAAa;QACpD,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import { DainOsClient, DainOsApiError } from './client.js';
|
|
|
13
13
|
import { allTools, getTool } from './tools/index.js';
|
|
14
14
|
import { toJsonSchema } from './tools/types.js';
|
|
15
15
|
const PACKAGE_NAME = 'dainos';
|
|
16
|
-
const PACKAGE_VERSION = '0.
|
|
16
|
+
const PACKAGE_VERSION = '0.2.0';
|
|
17
17
|
function fail(message) {
|
|
18
18
|
process.stderr.write(`[dainos-mcp] ${message}\n`);
|
|
19
19
|
process.exit(1);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer.d.ts","sourceRoot":"","sources":["../../src/tools/developer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA+LjD,eAAO,MAAM,cAAc,EAAE,cAAc,EAM1C,CAAC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Developer KB tools. Five operations: log_changelog_entry, log_session_context,
|
|
4
|
+
* log_knowledge_base_entry, list_recent_sessions, search_knowledge_base.
|
|
5
|
+
*
|
|
6
|
+
* These back the /wrapup, /recap, and /dev-kb slash commands. The slash command
|
|
7
|
+
* still does the conversation analysis (parsing decisions, lessons, etc.); the
|
|
8
|
+
* tools here are the persistence + retrieval surface. With these in place a
|
|
9
|
+
* developer needs only the DainOS MCP installed — no Supabase MCP token — and
|
|
10
|
+
* the workflows port to any MCP client (Cursor, Continue, etc.).
|
|
11
|
+
*
|
|
12
|
+
* All tools are cross-project: the caller supplies `project` (e.g. "dain-os",
|
|
13
|
+
* "herbert", "mabel") on every call. The backing tables live in the developer
|
|
14
|
+
* schema and span tenants.
|
|
15
|
+
*/
|
|
16
|
+
const commitTypeEnum = z.enum([
|
|
17
|
+
'feat', 'fix', 'chore', 'refactor', 'test', 'docs', 'perf', 'ci', 'build', 'revert', 'style',
|
|
18
|
+
]);
|
|
19
|
+
const sourceTypeEnum = z.enum([
|
|
20
|
+
'fix_commit', 'pr_comment', 'pr_review', 'code_review',
|
|
21
|
+
'ai_conversation', 'incident', 'documentation', 'debugging_session',
|
|
22
|
+
]);
|
|
23
|
+
const severityEnum = z.enum(['critical', 'high', 'medium', 'low']);
|
|
24
|
+
const kbCategoryEnum = z.enum(['gotcha', 'pattern', 'lesson', 'decision', 'workaround']);
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// log_changelog_entry — batch insert of commit records
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
const changelogEntrySchema = z.object({
|
|
29
|
+
commit_sha: z.string().length(40).describe('Full 40-character SHA.'),
|
|
30
|
+
branch: z.string().optional().describe('Defaults to "main" if omitted.'),
|
|
31
|
+
commit_type: commitTypeEnum.describe('Conventional-commit type prefix.'),
|
|
32
|
+
scope: z.string().optional(),
|
|
33
|
+
summary: z.string().describe('Commit message subject line.'),
|
|
34
|
+
description: z.string().optional(),
|
|
35
|
+
files_changed: z.number().int().optional(),
|
|
36
|
+
insertions: z.number().int().optional(),
|
|
37
|
+
deletions: z.number().int().optional(),
|
|
38
|
+
milestone: z.string().optional(),
|
|
39
|
+
task_ref: z.string().optional().describe('Linear / Jira / Notion task id.'),
|
|
40
|
+
impacts_config: z.boolean().optional().describe('Defaults false.'),
|
|
41
|
+
breaking_change: z.boolean().optional().describe('Defaults false.'),
|
|
42
|
+
tags: z.array(z.string()).optional(),
|
|
43
|
+
author: z.string().optional(),
|
|
44
|
+
committed_at: z.string().describe('ISO 8601 timestamp.'),
|
|
45
|
+
pr_number: z.number().int().optional(),
|
|
46
|
+
pr_url: z.string().optional(),
|
|
47
|
+
});
|
|
48
|
+
const logChangelogEntry = {
|
|
49
|
+
name: 'log_changelog_entry',
|
|
50
|
+
description: 'Append commit records to the developer changelog for a project. Use during /wrapup to persist today\'s commits. Accepts a batch (1-50 entries). Idempotent on (project, commit_sha): duplicates are silently skipped. Returns { inserted, skipped } counts.',
|
|
51
|
+
inputSchema: z.object({
|
|
52
|
+
project: z.string().describe('Project slug, e.g. "dain-os", "herbert", "mabel".'),
|
|
53
|
+
entries: z.array(changelogEntrySchema).min(1).max(50),
|
|
54
|
+
}),
|
|
55
|
+
handler: async (client, input) => {
|
|
56
|
+
const entries = input.entries.map((entry) => ({
|
|
57
|
+
...entry,
|
|
58
|
+
project: input.project,
|
|
59
|
+
}));
|
|
60
|
+
return client.post('/developer/changelog', { entries });
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// log_session_context — single session insert
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
const decisionSchema = z.object({
|
|
67
|
+
decision: z.string(),
|
|
68
|
+
reason: z.string(),
|
|
69
|
+
});
|
|
70
|
+
const logSessionContext = {
|
|
71
|
+
name: 'log_session_context',
|
|
72
|
+
description: 'Record a single development session for a project (one row per session). Captures decisions made, files touched, blockers, and handoff notes. Use during /wrapup to leave breadcrumbs for the next session. Read back via list_recent_sessions during /recap.',
|
|
73
|
+
inputSchema: z.object({
|
|
74
|
+
project: z.string().describe('Project slug, e.g. "dain-os".'),
|
|
75
|
+
session_name: z.string().describe('Short descriptive title.'),
|
|
76
|
+
session_date: z.string().optional().describe('YYYY-MM-DD. Defaults to today server-side.'),
|
|
77
|
+
operator: z.string().describe('e.g. "Dane + Claude Opus 4.7".'),
|
|
78
|
+
machine: z.string().optional(),
|
|
79
|
+
duration_minutes: z.number().int().optional(),
|
|
80
|
+
summary: z.string().describe('2-4 sentence overview of WHAT and WHY.'),
|
|
81
|
+
decisions_made: z.array(decisionSchema).optional().describe('Non-obvious choices future sessions need to understand.'),
|
|
82
|
+
files_touched: z.array(z.string()).optional(),
|
|
83
|
+
tasks_completed: z.array(z.string()).optional(),
|
|
84
|
+
blockers: z.array(z.string()).optional(),
|
|
85
|
+
handoff_notes: z.string().optional().describe('What the next session needs to know first.'),
|
|
86
|
+
tags: z.array(z.string()).optional(),
|
|
87
|
+
}),
|
|
88
|
+
handler: async (client, input) => client.post('/developer/sessions', input),
|
|
89
|
+
};
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// log_knowledge_base_entry — batch insert of KB findings
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
const kbEntrySchema = z.object({
|
|
94
|
+
category: kbCategoryEnum,
|
|
95
|
+
module: z.string().describe('System / area, e.g. "auth", "react", "prisma".'),
|
|
96
|
+
title: z.string().describe('Short descriptive title.'),
|
|
97
|
+
description: z.string().describe('What happened / what is this.'),
|
|
98
|
+
impact: z.string().optional().describe('What goes wrong if you don\'t know this.'),
|
|
99
|
+
prevention: z.string().optional().describe('How to avoid it next time.'),
|
|
100
|
+
severity: severityEnum.optional(),
|
|
101
|
+
source_type: sourceTypeEnum,
|
|
102
|
+
source_refs: z.array(z.string()).optional().describe('Links, file paths, or commit SHAs.'),
|
|
103
|
+
tags: z.array(z.string()).optional(),
|
|
104
|
+
platform: z.string().optional().describe('e.g. "supabase", "anthropic", "vercel".'),
|
|
105
|
+
});
|
|
106
|
+
const logKnowledgeBaseEntry = {
|
|
107
|
+
name: 'log_knowledge_base_entry',
|
|
108
|
+
description: 'Append KB findings (gotchas, patterns, lessons, decisions, workarounds) for a project. Only add entries for things that were SURPRISING, NON-OBVIOUS, or caused real problems. Use during /wrapup. Accepts a batch (1-50 entries). Check for similar existing titles via search_knowledge_base before adding to avoid duplicates.',
|
|
109
|
+
inputSchema: z.object({
|
|
110
|
+
project: z.string().describe('Project slug, e.g. "dain-os". Use "universal" for cross-product lessons.'),
|
|
111
|
+
entries: z.array(kbEntrySchema).min(1).max(50),
|
|
112
|
+
}),
|
|
113
|
+
handler: async (client, input) => {
|
|
114
|
+
const entries = input.entries.map((entry) => ({
|
|
115
|
+
...entry,
|
|
116
|
+
project: input.project,
|
|
117
|
+
}));
|
|
118
|
+
return client.post('/developer/knowledge-base', { entries });
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// list_recent_sessions — read recent sessions for /recap
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
const listRecentSessions = {
|
|
125
|
+
name: 'list_recent_sessions',
|
|
126
|
+
description: 'List the most recent development sessions for a project, newest first. Use during /recap to brief the user on what happened in the last 1-N sessions. Returns full session_context rows including decisions, blockers, and handoff_notes.',
|
|
127
|
+
inputSchema: z.object({
|
|
128
|
+
project: z.string().describe('Project slug.'),
|
|
129
|
+
limit: z.number().int().min(1).max(50).optional().describe('Default 10, max 50.'),
|
|
130
|
+
offset: z.number().int().min(0).optional().describe('For pagination.'),
|
|
131
|
+
}),
|
|
132
|
+
handler: async (client, input) => {
|
|
133
|
+
const params = new URLSearchParams();
|
|
134
|
+
params.set('project', input.project);
|
|
135
|
+
if (input.limit !== undefined)
|
|
136
|
+
params.set('limit', String(input.limit));
|
|
137
|
+
if (input.offset !== undefined)
|
|
138
|
+
params.set('offset', String(input.offset));
|
|
139
|
+
return client.get(`/developer/sessions?${params.toString()}`);
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// search_knowledge_base — read KB by project/module/severity/keyword
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
const searchKnowledgeBase = {
|
|
146
|
+
name: 'search_knowledge_base',
|
|
147
|
+
description: 'Search the developer KB for relevant gotchas, patterns, lessons, decisions, and workarounds. Use before writing code in a module (catches existing gotchas), during /dev-kb invocations, and before /wrapup to dedupe. Filters AND together; `q` is a case-insensitive substring match against title and description.',
|
|
148
|
+
inputSchema: z.object({
|
|
149
|
+
project: z.string().describe('Project slug. Filter by "universal" for cross-product entries.'),
|
|
150
|
+
module: z.string().optional().describe('e.g. "auth", "react", "prisma".'),
|
|
151
|
+
category: kbCategoryEnum.optional(),
|
|
152
|
+
severity: severityEnum.optional(),
|
|
153
|
+
q: z.string().optional().describe('Free-text match against title + description.'),
|
|
154
|
+
limit: z.number().int().min(1).max(50).optional().describe('Default 10.'),
|
|
155
|
+
offset: z.number().int().min(0).optional(),
|
|
156
|
+
}),
|
|
157
|
+
handler: async (client, input) => {
|
|
158
|
+
const params = new URLSearchParams();
|
|
159
|
+
params.set('project', input.project);
|
|
160
|
+
if (input.module)
|
|
161
|
+
params.set('module', input.module);
|
|
162
|
+
if (input.category)
|
|
163
|
+
params.set('category', input.category);
|
|
164
|
+
if (input.severity)
|
|
165
|
+
params.set('severity', input.severity);
|
|
166
|
+
if (input.q)
|
|
167
|
+
params.set('q', input.q);
|
|
168
|
+
if (input.limit !== undefined)
|
|
169
|
+
params.set('limit', String(input.limit));
|
|
170
|
+
if (input.offset !== undefined)
|
|
171
|
+
params.set('offset', String(input.offset));
|
|
172
|
+
return client.get(`/developer/knowledge-base/search?${params.toString()}`);
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
export const developerTools = [
|
|
176
|
+
logChangelogEntry,
|
|
177
|
+
logSessionContext,
|
|
178
|
+
logKnowledgeBaseEntry,
|
|
179
|
+
listRecentSessions,
|
|
180
|
+
searchKnowledgeBase,
|
|
181
|
+
];
|
|
182
|
+
//# sourceMappingURL=developer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer.js","sourceRoot":"","sources":["../../src/tools/developer.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ import type { ToolDefinition } from './types.js';
|
|
|
2
2
|
import { projectTools } from './projects.js';
|
|
3
3
|
import { taskTools } from './tasks.js';
|
|
4
4
|
import { commentTools } from './comments.js';
|
|
5
|
-
|
|
5
|
+
import { developerTools } from './developer.js';
|
|
6
|
+
export { projectTools, taskTools, commentTools, developerTools };
|
|
6
7
|
export type { ToolDefinition };
|
|
7
|
-
/** All tools exposed by the DainOS MCP server (
|
|
8
|
+
/** All tools exposed by the DainOS MCP server (17 total). */
|
|
8
9
|
export declare const allTools: ToolDefinition[];
|
|
9
10
|
/** Look up a tool by its exposed name. */
|
|
10
11
|
export declare function getTool(name: string): ToolDefinition | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,EAAE,cAAc,EAKpC,CAAC;AAEF,0CAA0C;AAC1C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEhE"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { projectTools } from './projects.js';
|
|
2
2
|
import { taskTools } from './tasks.js';
|
|
3
3
|
import { commentTools } from './comments.js';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { developerTools } from './developer.js';
|
|
5
|
+
export { projectTools, taskTools, commentTools, developerTools };
|
|
6
|
+
/** All tools exposed by the DainOS MCP server (17 total). */
|
|
6
7
|
export const allTools = [
|
|
7
8
|
...projectTools,
|
|
8
9
|
...taskTools,
|
|
9
10
|
...commentTools,
|
|
11
|
+
...developerTools,
|
|
10
12
|
];
|
|
11
13
|
/** Look up a tool by its exposed name. */
|
|
12
14
|
export function getTool(name) {
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AAGjE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,GAAG,YAAY;IACf,GAAG,SAAS;IACZ,GAAG,YAAY;IACf,GAAG,cAAc;CAClB,CAAC;AAEF,0CAA0C;AAC1C,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/tools/types.js
CHANGED
|
@@ -10,6 +10,20 @@ import { z } from 'zod';
|
|
|
10
10
|
export function toJsonSchema(schema) {
|
|
11
11
|
return zodToJsonSchema(schema);
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Pull a `.describe()` annotation off any Zod schema. Zod stores the string on
|
|
15
|
+
* `_def.description`, but the property isn't part of the public type for every
|
|
16
|
+
* wrapper kind, so we read it through a narrow cast.
|
|
17
|
+
*/
|
|
18
|
+
function descriptionOf(schema) {
|
|
19
|
+
return schema._def.description;
|
|
20
|
+
}
|
|
21
|
+
function withDescription(schema, result) {
|
|
22
|
+
const description = descriptionOf(schema);
|
|
23
|
+
if (description && !result.description)
|
|
24
|
+
result.description = description;
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
13
27
|
function zodToJsonSchema(schema) {
|
|
14
28
|
if (schema instanceof z.ZodObject) {
|
|
15
29
|
const shape = schema.shape;
|
|
@@ -27,40 +41,42 @@ function zodToJsonSchema(schema) {
|
|
|
27
41
|
};
|
|
28
42
|
if (required.length > 0)
|
|
29
43
|
result.required = required;
|
|
30
|
-
return result;
|
|
44
|
+
return withDescription(schema, result);
|
|
31
45
|
}
|
|
32
46
|
if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable) {
|
|
33
|
-
|
|
47
|
+
// Wrappers like `.optional().describe('...')` hold the description on the
|
|
48
|
+
// wrapper, not on the inner type. Forward it so the model sees the hint.
|
|
49
|
+
const inner = zodToJsonSchema(schema._def.innerType);
|
|
50
|
+
return withDescription(schema, inner);
|
|
34
51
|
}
|
|
35
52
|
if (schema instanceof z.ZodDefault) {
|
|
36
53
|
const inner = zodToJsonSchema(schema._def.innerType);
|
|
37
54
|
inner.default = schema._def.defaultValue();
|
|
38
|
-
return inner;
|
|
55
|
+
return withDescription(schema, inner);
|
|
39
56
|
}
|
|
40
57
|
if (schema instanceof z.ZodString) {
|
|
41
|
-
|
|
42
|
-
const description = schema._def.description;
|
|
43
|
-
if (description)
|
|
44
|
-
result.description = description;
|
|
45
|
-
return result;
|
|
58
|
+
return withDescription(schema, { type: 'string' });
|
|
46
59
|
}
|
|
47
60
|
if (schema instanceof z.ZodNumber) {
|
|
48
|
-
return { type: 'number' };
|
|
61
|
+
return withDescription(schema, { type: 'number' });
|
|
49
62
|
}
|
|
50
63
|
if (schema instanceof z.ZodBoolean) {
|
|
51
|
-
return { type: 'boolean' };
|
|
64
|
+
return withDescription(schema, { type: 'boolean' });
|
|
52
65
|
}
|
|
53
66
|
if (schema instanceof z.ZodEnum) {
|
|
54
|
-
return { type: 'string', enum: [...schema._def.values] };
|
|
67
|
+
return withDescription(schema, { type: 'string', enum: [...schema._def.values] });
|
|
55
68
|
}
|
|
56
69
|
if (schema instanceof z.ZodArray) {
|
|
57
|
-
return
|
|
70
|
+
return withDescription(schema, {
|
|
71
|
+
type: 'array',
|
|
72
|
+
items: zodToJsonSchema(schema._def.type),
|
|
73
|
+
});
|
|
58
74
|
}
|
|
59
75
|
if (schema instanceof z.ZodLiteral) {
|
|
60
76
|
const value = schema._def.value;
|
|
61
|
-
return { type: typeof value, enum: [value] };
|
|
77
|
+
return withDescription(schema, { type: typeof value, enum: [value] });
|
|
62
78
|
}
|
|
63
79
|
// Fallback: permissive object. Should never hit in practice with our schemas.
|
|
64
|
-
return { type: 'object' };
|
|
80
|
+
return withDescription(schema, { type: 'object' });
|
|
65
81
|
}
|
|
66
82
|
//# sourceMappingURL=types.js.map
|
package/dist/tools/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe,CAAC,MAAoB;IAC3C,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAqC,CAAC;QAC3D,MAAM,UAAU,GAA4C,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,UAAU,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,MAAM,GAA4B;YACtC,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,oBAAoB,EAAE,KAAK;SAC5B,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACpD,OAAO,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@dain-os/mcp-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server for DainOS — manage projects and tasks from Claude Code and other MCP clients",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"dain-mcp": "./dist/index.js"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@dain-os/mcp-server",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "MCP server for DainOS — manage projects and tasks from Claude Code and other MCP clients",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"dain-mcp": "./dist/index.js",
|
|
8
|
+
"mcp-server": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"files": ["dist", "README.md"],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsx watch src/index.ts",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"check-types": "tsc --noEmit"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
21
|
+
"zod": "^3.23.8"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^20.11.0",
|
|
25
|
+
"tsx": "^4.7.0",
|
|
26
|
+
"typescript": "5.8.2",
|
|
27
|
+
"vitest": "^1.6.0"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
}
|
|
35
|
+
}
|