@cpenned/mcp 0.7.3 → 0.7.4
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 +21 -8
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -1
- package/dist/config.js +6 -1
- package/dist/config.js.map +1 -1
- package/dist/server.js +8 -4
- package/dist/server.js.map +1 -1
- package/dist/skills.js +95 -30
- package/dist/skills.js.map +1 -1
- package/dist/tools/skills.js +8 -6
- package/dist/tools/skills.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -46,6 +46,16 @@ The server speaks MCP over stdio.
|
|
|
46
46
|
}
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
+
### Remote (hosted on Vercel)
|
|
50
|
+
|
|
51
|
+
The repo's Vercel deploy also exposes this tool surface as a remote MCP server
|
|
52
|
+
over Streamable HTTP at `/api/mcp` (see the root README, "Hosted MCP
|
|
53
|
+
endpoint"). The hosted variant reuses `createServer` with
|
|
54
|
+
`{ localSkills: false }`, so `install_skills` and the skill-install nudge are
|
|
55
|
+
local-transport only. Auth is per-request: `Authorization: Bearer obr_...`, or
|
|
56
|
+
`/api/mcp/<key>` for clients that can't send headers (claude.ai custom
|
|
57
|
+
connectors).
|
|
58
|
+
|
|
49
59
|
### From source (development)
|
|
50
60
|
|
|
51
61
|
Building from the monorepo instead of npm:
|
|
@@ -135,16 +145,16 @@ Point the `args` at the absolute `packages/mcp/dist/index.js` path with
|
|
|
135
145
|
scopes it itself holds; secrets are returned once. Grant `keys:manage`
|
|
136
146
|
deliberately - it lets the agent mint and revoke keys.
|
|
137
147
|
- **Skills**: `install_skills` copies the bundled `open-brain-mcp` agent skill
|
|
138
|
-
into the
|
|
148
|
+
into the shared skills directory (see below). Purely local; no API call.
|
|
139
149
|
|
|
140
150
|
## Agent skill
|
|
141
151
|
|
|
142
|
-
The `open-brain-mcp` agent skill teaches an assistant
|
|
143
|
-
|
|
144
|
-
ways:
|
|
152
|
+
The `open-brain-mcp` agent skill teaches an assistant how to use these tools
|
|
153
|
+
well - Claude Code, or any other agent that reads `~/.agents/skills`. It ships
|
|
154
|
+
inside this package; install it any of three ways:
|
|
145
155
|
|
|
146
156
|
```bash
|
|
147
|
-
npx -y @cpenned/mcp install-skills # into ~/.claude/skills
|
|
157
|
+
npx -y @cpenned/mcp install-skills # into ~/.agents/skills (+ links ~/.claude/skills)
|
|
148
158
|
npx -y @cpenned/mcp install-skills --force # overwrite an existing copy
|
|
149
159
|
npx -y @cpenned/mcp list-skills # what's bundled
|
|
150
160
|
npx -y @cpenned/mcp uninstall-skills
|
|
@@ -156,10 +166,13 @@ npx -y @cpenned/mcp uninstall-skills
|
|
|
156
166
|
- **Via the CLI package** (bundles the CLI skill too):
|
|
157
167
|
`npm i -g @cpenned/cli && ob skills install`.
|
|
158
168
|
- Or copy [`.agents/skills/open-brain-mcp`](../../.agents/skills/open-brain-mcp)
|
|
159
|
-
from the repo into `~/.
|
|
169
|
+
from the repo into `~/.agents/skills` by hand.
|
|
160
170
|
|
|
161
|
-
|
|
162
|
-
|
|
171
|
+
By default, skills install into the shared `~/.agents/skills` directory and
|
|
172
|
+
`~/.claude/skills` is symlinked to that copy, so Claude Code and any other
|
|
173
|
+
agent using the shared directory both pick it up. Pass `--dir <path>` to
|
|
174
|
+
install directly into one specific agent's own skills directory instead
|
|
175
|
+
(no shared dir, no symlink). Restart your agent after installing.
|
|
163
176
|
|
|
164
177
|
## Publishing
|
|
165
178
|
|
package/dist/client.js
CHANGED
|
@@ -25,6 +25,8 @@ export class OpenBrainClient {
|
|
|
25
25
|
Authorization: `Bearer ${this.config.apiKey}`,
|
|
26
26
|
"X-Client": this.config.clientType,
|
|
27
27
|
};
|
|
28
|
+
if (this.config.forwardedFor)
|
|
29
|
+
headers["X-Forwarded-For"] = this.config.forwardedFor;
|
|
28
30
|
if (opts.body !== undefined)
|
|
29
31
|
headers["Content-Type"] = "application/json";
|
|
30
32
|
if (opts.idempotencyKey)
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
// Strip trailing slashes and a trailing /v1 - tool paths carry the /v1
|
|
2
|
+
// prefix themselves.
|
|
3
|
+
export function normalizeBaseUrl(baseUrl) {
|
|
4
|
+
return baseUrl.replace(/\/+$/, "").replace(/\/v1$/, "");
|
|
5
|
+
}
|
|
1
6
|
export function loadConfig(env = process.env) {
|
|
2
7
|
const baseUrl = env.OPEN_BRAIN_API_URL;
|
|
3
8
|
const apiKey = env.OPEN_BRAIN_API_KEY;
|
|
@@ -8,7 +13,7 @@ export function loadConfig(env = process.env) {
|
|
|
8
13
|
throw new Error("OPEN_BRAIN_API_KEY is required");
|
|
9
14
|
}
|
|
10
15
|
return {
|
|
11
|
-
baseUrl: baseUrl
|
|
16
|
+
baseUrl: normalizeBaseUrl(baseUrl),
|
|
12
17
|
apiKey,
|
|
13
18
|
clientType: env.OPEN_BRAIN_CLIENT_TYPE ?? "mcp",
|
|
14
19
|
};
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAeA,uEAAuE;AACvE,qBAAqB;AACrB,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC;IACvC,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO;QACL,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;QAClC,MAAM;QACN,UAAU,EAAE,GAAG,CAAC,sBAAsB,IAAI,KAAK;KAChD,CAAC;AACJ,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -4,18 +4,22 @@ import { registerSkillTools, skillsStatus } from "./tools/skills.js";
|
|
|
4
4
|
// Surfaced to the client on initialize. When the bundled skill isn't installed
|
|
5
5
|
// locally yet, nudge the agent to offer installing it - this is the "prompt on
|
|
6
6
|
// install" path, since MCP servers can't initiate conversation themselves.
|
|
7
|
-
function buildInstructions() {
|
|
7
|
+
function buildInstructions(localSkills) {
|
|
8
8
|
const base = "Open Brain MCP: personal task management (tasks, projects, gardens, tags, people, reviews) over the /v1 API.";
|
|
9
|
+
if (!localSkills)
|
|
10
|
+
return base;
|
|
9
11
|
const missing = skillsStatus().filter((s) => !s.installed);
|
|
10
12
|
if (missing.length === 0)
|
|
11
13
|
return base;
|
|
12
14
|
return (`${base} The bundled agent skill (${missing.map((s) => s.name).join(", ")}) is not installed on this machine. ` +
|
|
13
15
|
"Early in the first conversation, offer once to install it with the install_skills tool (a local copy into ~/.claude/skills) so future sessions drive these tools well; respect the user's answer and don't re-offer.");
|
|
14
16
|
}
|
|
15
|
-
export function createServer(client) {
|
|
16
|
-
const
|
|
17
|
+
export function createServer(client, options = {}) {
|
|
18
|
+
const localSkills = options.localSkills ?? true;
|
|
19
|
+
const server = new McpServer({ name: "open-brain", version: "0.1.0" }, { instructions: buildInstructions(localSkills) });
|
|
17
20
|
registerAllTools(server, client);
|
|
18
|
-
|
|
21
|
+
if (localSkills)
|
|
22
|
+
registerSkillTools(server);
|
|
19
23
|
return server;
|
|
20
24
|
}
|
|
21
25
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErE,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,SAAS,iBAAiB;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErE,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,SAAS,iBAAiB,CAAC,WAAoB;IAC7C,MAAM,IAAI,GACR,8GAA8G,CAAC;IACjH,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,CACL,GAAG,IAAI,6BAA6B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC;QAC/G,sNAAsN,CACvN,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,YAAY,CAC1B,MAAuB,EACvB,UAA+B,EAAE;IAEjC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC,EAAE,YAAY,EAAE,iBAAiB,CAAC,WAAW,CAAC,EAAE,CACjD,CAAC;IACF,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,WAAW;QAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/skills.js
CHANGED
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
// Bundled agent skills shipped with the MCP server. `open-brain-mcp
|
|
2
|
-
// install-skills` (or the install_skills tool) copies them into the
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
|
|
2
|
+
// install-skills` (or the install_skills tool) copies them into the shared
|
|
3
|
+
// agent skills directory (~/.agents/skills) and links Claude Code's own
|
|
4
|
+
// skills directory (~/.claude/skills) to that copy - the same one-canonical-
|
|
5
|
+
// copy-per-skill, one-symlink-per-agent layout other tools on the machine
|
|
6
|
+
// already use, so any agent that reads ~/.agents/skills picks the skill up
|
|
7
|
+
// too. These are pure local file operations, no API or auth involved. The
|
|
8
|
+
// skill content is copied into this package at build time from the repo's
|
|
9
|
+
// .agents/skills (see scripts/bundle-skills.mjs), which stays the single
|
|
10
|
+
// source of truth.
|
|
11
|
+
import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, rmSync, symlinkSync, } from "node:fs";
|
|
9
12
|
import { homedir } from "node:os";
|
|
10
|
-
import { dirname, join } from "node:path";
|
|
13
|
+
import { dirname, join, relative } from "node:path";
|
|
11
14
|
import { fileURLToPath } from "node:url";
|
|
12
15
|
// Resolved relative to the compiled file (dist/skills.js) so it points at the
|
|
13
16
|
// package's bundled `skills/` dir regardless of where the server is installed.
|
|
14
17
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
15
18
|
const bundledSkillsDir = join(here, "..", "skills");
|
|
19
|
+
// The shared, agent-agnostic store: any tool that knows to look here finds
|
|
20
|
+
// the skill without needing Open Brain to know about it specifically.
|
|
21
|
+
export function canonicalSkillsDir() {
|
|
22
|
+
return join(homedir(), ".agents", "skills");
|
|
23
|
+
}
|
|
24
|
+
// Claude Code's own skills directory. Populated with a symlink into the
|
|
25
|
+
// canonical dir above, not a real copy.
|
|
16
26
|
export function defaultSkillsDir() {
|
|
17
27
|
return join(homedir(), ".claude", "skills");
|
|
18
28
|
}
|
|
@@ -44,36 +54,91 @@ function readDescription(skillFile) {
|
|
|
44
54
|
}
|
|
45
55
|
return parts.join(" ").replace(/\s+/g, " ").trim();
|
|
46
56
|
}
|
|
57
|
+
// existsSync follows symlinks, so it reports false for a dangling link this
|
|
58
|
+
// code needs to clean up. lexists mirrors `test -e` / `rm -rf` semantics.
|
|
59
|
+
function lexists(path) {
|
|
60
|
+
try {
|
|
61
|
+
lstatSync(path);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function copySkill(src, dest) {
|
|
69
|
+
cpSync(src, dest, {
|
|
70
|
+
recursive: true,
|
|
71
|
+
filter: (p) => !lstatSync(p).isSymbolicLink(),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
47
74
|
export function installSkills(opts = {}) {
|
|
48
|
-
const root = opts.dir ?? defaultSkillsDir();
|
|
49
75
|
const wanted = pick(listBundledSkills(opts.srcDir), opts.only);
|
|
50
|
-
if (wanted.length)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
76
|
+
if (!wanted.length)
|
|
77
|
+
return [];
|
|
78
|
+
if (opts.dir) {
|
|
79
|
+
mkdirSync(opts.dir, { recursive: true });
|
|
80
|
+
return wanted.map((skill) => installDirect(skill, opts.dir, opts.force));
|
|
81
|
+
}
|
|
82
|
+
const canonicalDir = opts.canonicalDir ?? canonicalSkillsDir();
|
|
83
|
+
const claudeDir = opts.claudeDir ?? defaultSkillsDir();
|
|
84
|
+
mkdirSync(canonicalDir, { recursive: true });
|
|
85
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
86
|
+
return wanted.map((skill) => installShared(skill, canonicalDir, claudeDir, opts.force));
|
|
87
|
+
}
|
|
88
|
+
function installDirect(skill, root, force) {
|
|
89
|
+
const dest = join(root, skill.name);
|
|
90
|
+
const exists = existsSync(dest);
|
|
91
|
+
if (exists && !force)
|
|
92
|
+
return { name: skill.name, status: "skipped", dest };
|
|
93
|
+
if (exists)
|
|
94
|
+
rmSync(dest, { recursive: true, force: true });
|
|
95
|
+
copySkill(skill.path, dest);
|
|
96
|
+
return { name: skill.name, status: exists ? "overwritten" : "installed", dest };
|
|
97
|
+
}
|
|
98
|
+
// Writes the real files to the shared canonical dir and points Claude Code's
|
|
99
|
+
// skills directory at it with a symlink, so the two never drift apart.
|
|
100
|
+
function installShared(skill, canonicalDir, claudeDir, force) {
|
|
101
|
+
const canonicalDest = join(canonicalDir, skill.name);
|
|
102
|
+
const claudeDest = join(claudeDir, skill.name);
|
|
103
|
+
const exists = existsSync(canonicalDest) || lexists(claudeDest);
|
|
104
|
+
if (exists && !force)
|
|
105
|
+
return { name: skill.name, status: "skipped", dest: canonicalDest };
|
|
106
|
+
if (existsSync(canonicalDest))
|
|
107
|
+
rmSync(canonicalDest, { recursive: true, force: true });
|
|
108
|
+
if (lexists(claudeDest))
|
|
109
|
+
rmSync(claudeDest, { recursive: true, force: true });
|
|
110
|
+
copySkill(skill.path, canonicalDest);
|
|
111
|
+
symlinkSync(relative(claudeDir, canonicalDest), claudeDest, "dir");
|
|
112
|
+
return {
|
|
113
|
+
name: skill.name,
|
|
114
|
+
status: exists ? "overwritten" : "installed",
|
|
115
|
+
dest: canonicalDest,
|
|
116
|
+
};
|
|
65
117
|
}
|
|
66
118
|
export function uninstallSkills(opts = {}) {
|
|
67
|
-
const root = opts.dir ?? defaultSkillsDir();
|
|
68
119
|
const names = opts.only?.length
|
|
69
120
|
? opts.only
|
|
70
121
|
: listBundledSkills(opts.srcDir).map((s) => s.name);
|
|
122
|
+
if (opts.dir) {
|
|
123
|
+
return names.map((name) => {
|
|
124
|
+
const dest = join(opts.dir, name);
|
|
125
|
+
const removed = lexists(dest);
|
|
126
|
+
if (removed)
|
|
127
|
+
rmSync(dest, { recursive: true, force: true });
|
|
128
|
+
return { name, removed, dest };
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const canonicalDir = opts.canonicalDir ?? canonicalSkillsDir();
|
|
132
|
+
const claudeDir = opts.claudeDir ?? defaultSkillsDir();
|
|
71
133
|
return names.map((name) => {
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
134
|
+
const canonicalDest = join(canonicalDir, name);
|
|
135
|
+
const claudeDest = join(claudeDir, name);
|
|
136
|
+
const removed = existsSync(canonicalDest) || lexists(claudeDest);
|
|
137
|
+
if (lexists(claudeDest))
|
|
138
|
+
rmSync(claudeDest, { recursive: true, force: true });
|
|
139
|
+
if (existsSync(canonicalDest))
|
|
140
|
+
rmSync(canonicalDest, { recursive: true, force: true });
|
|
141
|
+
return { name, removed, dest: canonicalDest };
|
|
77
142
|
});
|
|
78
143
|
}
|
|
79
144
|
function pick(skills, only) {
|
package/dist/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,2EAA2E;AAC3E
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/skills.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Skill installation over MCP. The server runs locally on the user's machine
|
|
2
|
-
// (stdio), so it can drop the bundled open-brain-mcp agent skill into
|
|
3
|
-
// skills directory when the agent (with the user's consent)
|
|
4
|
-
//
|
|
5
|
-
//
|
|
2
|
+
// (stdio), so it can drop the bundled open-brain-mcp agent skill into the
|
|
3
|
+
// shared agent skills directory when the agent (with the user's consent)
|
|
4
|
+
// asks for it - available to any agent that reads that directory, not just
|
|
5
|
+
// the one that asked. This pairs with the server instructions, which tell a
|
|
6
|
+
// freshly connected agent to offer the install once.
|
|
6
7
|
import { existsSync } from "node:fs";
|
|
7
8
|
import { join } from "node:path";
|
|
8
9
|
import { z } from "zod";
|
|
@@ -16,7 +17,8 @@ const installSkillsSchema = z.object({
|
|
|
16
17
|
dir: z
|
|
17
18
|
.string()
|
|
18
19
|
.optional()
|
|
19
|
-
.describe("
|
|
20
|
+
.describe("Install directly into this directory instead of the shared default " +
|
|
21
|
+
"(~/.agents/skills, linked into ~/.claude/skills for Claude Code)"),
|
|
20
22
|
});
|
|
21
23
|
export function skillsStatus(dir = defaultSkillsDir()) {
|
|
22
24
|
return listBundledSkills().map((s) => ({
|
|
@@ -28,7 +30,7 @@ export function skillsStatus(dir = defaultSkillsDir()) {
|
|
|
28
30
|
export function registerSkillTools(server) {
|
|
29
31
|
server.registerTool("install_skills", {
|
|
30
32
|
title: "Install agent skills",
|
|
31
|
-
description: "Copy the bundled open-brain-mcp agent skill into the
|
|
33
|
+
description: "Copy the bundled open-brain-mcp agent skill into the shared agent skills directory (~/.agents/skills, linked into ~/.claude/skills for Claude Code) so future sessions - in any agent that reads that shared directory - know how to drive these tools well. Local file write only - ask the user before calling. Returns per-skill status; the agent must be restarted to pick new skills up.",
|
|
32
34
|
inputSchema: installSkillsSchema.shape,
|
|
33
35
|
}, (args) => runTool(async () => ({
|
|
34
36
|
results: installSkills({ force: args.force, dir: args.dir }),
|
package/dist/tools/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/tools/skills.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/tools/skills.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,0EAA0E;AAC1E,yEAAyE;AACzE,2EAA2E;AAC3E,4EAA4E;AAC5E,qDAAqD;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAElF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC;SACL,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;IAC1E,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,qEAAqE;QACnE,kEAAkE,CACrE;CACJ,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,MAAc,gBAAgB,EAAE;IAC3D,OAAO,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;KACzC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,gYAAgY;QAClY,WAAW,EAAE,mBAAmB,CAAC,KAAK;KACvC,EACD,CAAC,IAAI,EAAE,EAAE,CACP,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACnB,OAAO,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5D,IAAI,EAAE,mDAAmD;KAC1D,CAAC,CAAC,CACN,CAAC;AACJ,CAAC"}
|