@sammorrowdrums/mcpi-ext 0.1.0 → 0.2.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/README.md +109 -139
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/tool-cli/index.d.ts +2 -2
- package/dist/tool-cli/index.d.ts.map +1 -1
- package/dist/tool-cli/index.js +1 -2
- package/dist/tool-cli/index.js.map +1 -1
- package/package.json +9 -7
- package/.dockerignore +0 -6
- package/.github/dependabot.yml +0 -25
- package/.github/workflows/ci.yml +0 -50
- package/.hadolint.yaml +0 -6
- package/.prettierignore +0 -4
- package/.prettierrc +0 -7
- package/AGENTS.md +0 -118
- package/DECISIONS.md +0 -99
- package/Dockerfile +0 -39
- package/aube-lock.yaml +0 -4146
- package/eslint.config.js +0 -27
- package/images/banner.webp +0 -0
- package/images/code-c-maude.webp +0 -0
- package/images/nuclear-mcp-football.webp +0 -0
- package/images/the-skill-dealer.webp +0 -0
- package/mise.toml +0 -65
- package/scripts/docker-entrypoint.sh +0 -29
- package/scripts/test-echo-server.mjs +0 -28
- package/scripts/test-mcp-integration.mjs +0 -59
- package/scripts/test-tool-cli-smoke.mjs +0 -62
- package/src/code-mode/code-mode-integration.test.ts +0 -135
- package/src/code-mode/eligibility.test.ts +0 -60
- package/src/code-mode/eligibility.ts +0 -16
- package/src/code-mode/executor.test.ts +0 -168
- package/src/code-mode/executor.ts +0 -163
- package/src/code-mode/index.ts +0 -208
- package/src/code-mode/tools.ts +0 -110
- package/src/code-mode/type-hints.test.ts +0 -187
- package/src/code-mode/type-hints.ts +0 -249
- package/src/docker-e2e.test.ts +0 -195
- package/src/docker-e2e.ts +0 -277
- package/src/index.test.ts +0 -8
- package/src/index.ts +0 -158
- package/src/mcp/client-manager.test.ts +0 -250
- package/src/mcp/client-manager.ts +0 -199
- package/src/mcp/config-loader.test.ts +0 -115
- package/src/mcp/config-loader.ts +0 -46
- package/src/mcp/config.ts +0 -40
- package/src/mcp/index.ts +0 -4
- package/src/skills/discover.ts +0 -81
- package/src/skills/format.test.ts +0 -70
- package/src/skills/format.ts +0 -42
- package/src/skills/index.ts +0 -9
- package/src/skills/load-skill-tool.ts +0 -136
- package/src/skills/mcp-tool-proxy.ts +0 -143
- package/src/skills/skill-integration.test.ts +0 -139
- package/src/skills/skill-registry.test.ts +0 -83
- package/src/skills/skill-registry.ts +0 -69
- package/src/test-servers/weather-server.ts +0 -171
- package/src/test-servers/weather-stdio.ts +0 -11
- package/src/tool-cli/cli.ts +0 -232
- package/src/tool-cli/constants.ts +0 -15
- package/src/tool-cli/format.test.ts +0 -33
- package/src/tool-cli/format.ts +0 -56
- package/src/tool-cli/index.ts +0 -3
- package/src/tool-cli/rpc-client.ts +0 -39
- package/src/tool-cli/rpc-server.test.ts +0 -193
- package/src/tool-cli/rpc-server.ts +0 -287
- package/tsconfig.json +0 -21
package/README.md
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
# mcpi-ext
|
|
2
2
|
|
|
3
|
-
> **Experimental.** This extension implements progressive MCP tool discovery via skills for [mcpi](https://github.com/SamMorrowDrums/mcpi) (an experimental pi fork).
|
|
3
|
+
> **Experimental.** This extension implements progressive MCP tool discovery via skills for [mcpi](https://github.com/SamMorrowDrums/mcpi) (an experimental pi fork). See the [skills-as-groups proposal](https://github.com/modelcontextprotocol/experimental-ext-grouping/pull/13) for the proposed MCP spec addition, and the [progressive tool discovery docs](https://github.com/SamMorrowDrums/mcpi/blob/main/docs/progressive-tool-discovery.md) for implementation details.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
npm install -g @sammorrowdrums/mcpi@latest @sammorrowdrums/mcpi-ext@latest @sammorrowdrums/tool-cli@latest
|
|
7
|
+
mcpi --extension $(npm root -g)/@sammorrowdrums/mcpi-ext/dist/index.js \
|
|
8
|
+
--mcp-config ~/.config/mcpi-ext/mcp.json
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
See [Quick Start](#quick-start) for MCP server configuration.
|
|
12
|
+
|
|
13
|
+
---
|
|
4
14
|
|
|
5
15
|

|
|
6
16
|
|
|
@@ -30,143 +40,85 @@ Building custom [MCP](https://modelcontextprotocol.io/) support as [mcpi](https:
|
|
|
30
40
|
|
|
31
41
|
> _The Skill Dealer does not give you what you ask for. The Skill Dealer gives you what you need — and nothing more._
|
|
32
42
|
|
|
33
|
-
MCP servers
|
|
34
|
-
|
|
35
|
-
This approach is **cache-preserving**: the tools array and system prompt stay constant throughout the conversation, so prompt cache is never invalidated by skill activation.
|
|
43
|
+
MCP servers ship `skill://` resources — SKILL.md files declaring which tools a skill gates. The extension discovers skills on connection and registers their tools with `deferred: true`: present in the registry for dispatch but hidden from the model and the prompt. **Cache is preserved** — neither the tools array nor the system prompt ever changes.
|
|
36
44
|
|
|
37
|
-
|
|
45
|
+
When the model calls `load_skill`, the skill's instructions arrive and its tools are unblocked. The model discovers tools from the skill body and can call them immediately. The MCP server itself declares how its tools should be discovered.
|
|
38
46
|
|
|
39
|
-
|
|
47
|
+
📖 [**How it works →**](docs/skills.md) — deferred gating, `defer_loading` provider support, `tool_call` hook enforcement.
|
|
40
48
|
|
|
41
|
-
|
|
49
|
+
> _"What you do not need to know," said the Skill Dealer, shuffling the deck, "you will not be burdened with knowing."_
|
|
42
50
|
|
|
43
|
-
|
|
51
|
+

|
|
44
52
|
|
|
45
|
-
|
|
53
|
+
---
|
|
46
54
|
|
|
47
|
-
|
|
55
|
+
## II. The Nuclear Football
|
|
48
56
|
|
|
49
|
-
|
|
50
|
-
2. The skill's `allowedTools` are added to the `enabledTools` set, unblocking the `tool_call` gate
|
|
51
|
-
3. The model can now call the tools — it discovers them from the skill body (which names them) and the provider's grammar
|
|
57
|
+

|
|
52
58
|
|
|
53
|
-
|
|
54
|
-
sequenceDiagram
|
|
55
|
-
participant Model
|
|
56
|
-
participant load_skill
|
|
57
|
-
participant SkillRegistry
|
|
58
|
-
participant MCP Server
|
|
59
|
-
participant tool_call gate
|
|
60
|
-
|
|
61
|
-
Model->>load_skill: load_skill("github-pr")
|
|
62
|
-
load_skill->>SkillRegistry: Look up skill
|
|
63
|
-
SkillRegistry-->>load_skill: skill metadata + allowed-tools
|
|
64
|
-
load_skill->>MCP Server: Read skill://github-pr
|
|
65
|
-
MCP Server-->>load_skill: SKILL.md body
|
|
66
|
-
load_skill->>tool_call gate: Enable allowed-tools
|
|
67
|
-
load_skill-->>Model: Return workflow instructions
|
|
68
|
-
Note over Model: Skill body names the tools.<br/>Model calls them via tool_use.
|
|
69
|
-
Model->>tool_call gate: create_pull_request(...)
|
|
70
|
-
tool_call gate-->>Model: ✓ Allowed (skill loaded)
|
|
71
|
-
```
|
|
59
|
+
> _The Football is not a weapon. The Football is the authority to use weapons. Whoever holds it can reach any server, call any tool, chain any result — but they must do so deliberately, one command at a time._
|
|
72
60
|
|
|
73
|
-
|
|
61
|
+
[`tool-cli`](https://github.com/SamMorrowDrums/tool-cli) is a thin CLI binary that speaks JSON-RPC to the extension. The agent uses it like any shell command — composable with pipes, grep, jq, loops. Discovery is progressive: server list → tool list → schema → call. Each step pays only the tokens it needs.
|
|
74
62
|
|
|
75
|
-
|
|
63
|
+
📖 [**How it works →**](docs/tool-cli.md) — architecture, progressive discovery, shell composability.
|
|
64
|
+
📦 [**Standalone package →**](https://github.com/SamMorrowDrums/tool-cli) — `ToolProvider` interface, server, and implementor guidance for other languages.
|
|
76
65
|
|
|
77
|
-
|
|
66
|
+
> _They pass the Football from hand to hand. It is heavy with potential. Every tool on every server is one command away — but you must type the command yourself._
|
|
78
67
|
|
|
79
|
-
|
|
68
|
+

|
|
80
69
|
|
|
81
70
|
---
|
|
82
71
|
|
|
83
|
-
##
|
|
84
|
-
|
|
85
|
-

|
|
86
|
-
|
|
87
|
-
> _The Football is not a weapon. The Football is the authority to use weapons. Whoever holds it can reach any server, call any tool, chain any result — but they must do so deliberately, one command at a time._
|
|
88
|
-
|
|
89
|
-
`tool-cli` is a thin CLI binary that speaks JSON-RPC 2.0 to the extension over HTTP. The agent uses it like any shell command — composable with pipes, grep, jq, loops, and all the bash idioms it already knows.
|
|
90
|
-
|
|
91
|
-
```mermaid
|
|
92
|
-
flowchart TD
|
|
93
|
-
A["Agent (mcpi)"] -->|shell exec| B["tool-cli <server> <tool> '{args}'"]
|
|
94
|
-
B -->|"HTTP JSON-RPC (localhost:7179)"| C["ToolCliRpcServer (in extension)"]
|
|
95
|
-
C -->|"MCP protocol (stdio/HTTP)"| D["MCP Server(s)"]
|
|
96
|
-
```
|
|
72
|
+
## III. Codey C. Maude
|
|
97
73
|
|
|
98
|
-
|
|
74
|
+

|
|
99
75
|
|
|
100
|
-
|
|
101
|
-
tool-cli --help # What servers exist?
|
|
102
|
-
tool-cli github # What tools does this server have?
|
|
103
|
-
tool-cli github search_code # What's the schema for this tool?
|
|
104
|
-
tool-cli github search_code '{"query":"auth"}' # Call it
|
|
105
|
-
```
|
|
76
|
+
> _Codey does not ask permission. Codey does not need to. Everything Codey touches is read-only, every result is typed, and the sandbox cannot be escaped. Codey is safe by construction._
|
|
106
77
|
|
|
107
|
-
|
|
78
|
+
Code Mode targets **read-only** tools with **structured output**. The model writes JavaScript that chains MCP tool calls inside a V8 isolate — memory-limited, time-limited, no filesystem or network access. Perfect for pagination loops, aggregation, and joins across many calls.
|
|
108
79
|
|
|
109
|
-
|
|
110
|
-
# Chain tool calls
|
|
111
|
-
tool-cli myserver list_items '{}' | jq -r '.[0].id' | \
|
|
112
|
-
xargs -I{} tool-cli myserver get_item '{"id":"{}"}'
|
|
113
|
-
|
|
114
|
-
# Process collections
|
|
115
|
-
for city in London Tokyo Paris; do
|
|
116
|
-
echo "=== $city ==="
|
|
117
|
-
tool-cli weather check_weather '{"city":"'"$city"'"}'
|
|
118
|
-
done
|
|
119
|
-
|
|
120
|
-
# Combine with the Unix toolbox
|
|
121
|
-
tool-cli myserver export_csv '{"table":"users"}' | sort -t, -k2 | head -20
|
|
122
|
-
```
|
|
80
|
+
📖 [**How it works →**](docs/code-mode.md) — sandbox isolation, eligibility, tool dispatch.
|
|
123
81
|
|
|
124
|
-
|
|
82
|
+
> _"I can see everything," Codey said, eyes reflecting infinite JSON. "I just can't touch it. That's the point. That's why they trust me."_
|
|
125
83
|
|
|
126
|
-
|
|
84
|
+

|
|
127
85
|
|
|
128
86
|
---
|
|
129
87
|
|
|
130
|
-
##
|
|
88
|
+
## When to Use Each Tier
|
|
131
89
|
|
|
132
|
-
|
|
90
|
+
> _They asked the three: "Why are there three of you? Isn't one enough?"_
|
|
91
|
+
>
|
|
92
|
+
> _The Skill Dealer laid down a card. "When you know the ritual — the steps, the order, the tools that belong together — you come to me. I give you the ceremony whole."_
|
|
93
|
+
>
|
|
94
|
+
> _The Football's briefcase clicked open. "When you need one answer, quickly, and you know what you're looking for — you reach for me. I'm a shell command. I compose."_
|
|
95
|
+
>
|
|
96
|
+
> _Codey smiled, cross-legged in the isolate. "And when the answer is buried in nine pages of data, when you need loops and math and joins across a thousand records — you write the code, and I run it. Safely."_
|
|
97
|
+
>
|
|
98
|
+
> _"Three is not redundancy," said the Skill Dealer. "Three is completeness."_
|
|
133
99
|
|
|
134
|
-
|
|
100
|
+
**The Skill Dealer** — when there's a curated workflow for the domain task. "Triage these 20 issues" means loading the triage skill, which gives you the right tools _plus_ the workflow instructions (dedup checks, labeling conventions, close criteria). Re-deriving that from raw tool calls is wasteful and error-prone.
|
|
135
101
|
|
|
136
|
-
|
|
102
|
+
**The Nuclear Football** — one-shot or exploratory calls, especially when piping through Unix tools. `tool-cli github search_code '{"query":"auth"}' | jq '.items[].path'` — one call, pipe to jq, done. Also perfect for discovering what's on a server you haven't used before.
|
|
137
103
|
|
|
138
|
-
|
|
104
|
+
**Codey C. Maude** — when you need real computation across many calls: pagination loops, aggregation, joining results, math. 876 issues across 9 pages, counting labels per issue, summing into a histogram — that's a loop with state. Doing it via tool-cli would mean 9 separate calls plus shell-side aggregation. Fragile. Codey does it in one sandbox execution.
|
|
139
105
|
|
|
140
|
-
|
|
141
|
-
// Executed in a V8 isolate via isolated-vm
|
|
142
|
-
const issues = await codemode.list_issues({ repo: "owner/repo", state: "open" });
|
|
143
|
-
const critical = issues.filter((i) => i.labels.includes("critical"));
|
|
144
|
-
const details = await Promise.all(critical.map((i) => codemode.get_issue({ number: i.number })));
|
|
145
|
-
return details.map((d) => ({ title: d.title, assignee: d.assignee }));
|
|
146
|
-
```
|
|
106
|
+
### A single task using all three
|
|
147
107
|
|
|
148
|
-
|
|
108
|
+
> _"Triage the backlog of github/github-mcp-server: find stale bugs older than 90 days with no recent activity, summarize patterns, and close obvious duplicates."_
|
|
149
109
|
|
|
150
|
-
|
|
151
|
-
- **No access** to filesystem, network, or Node.js APIs
|
|
152
|
-
- Tool calls dispatch to the host via `Reference` callbacks — MCP execution happens outside the sandbox
|
|
153
|
-
- ~15ms overhead, negligible vs network I/O
|
|
110
|
+
1. **Codey** paginated all open bug issues, filtered by `updated < 90d ago`, grouped by label and keyword to find clusters. Computation across many pages — this is what sandboxes are for.
|
|
154
111
|
|
|
155
|
-
|
|
112
|
+
2. **The Football** spot-checked suspect issues. `tool-cli github get_issue '{"number":42}'` piped through `jq` to eyeball specific fields. Quick, ad-hoc, composable.
|
|
156
113
|
|
|
157
|
-
|
|
158
|
-
| -------------- | ---------------------------------------------------------------------------------- |
|
|
159
|
-
| `code_search` | Discover available tools — `codemode.listTools()`, `codemode.describeTools(names)` |
|
|
160
|
-
| `code_execute` | Chain tool calls — write JS that calls `codemode.toolName(args)` |
|
|
114
|
+
3. **The Skill Dealer** loaded `triage-issues` to actually close the duplicates — following the project's triage workflow with correct labels, comment templates, and close reasons. The ceremony, performed correctly.
|
|
161
115
|
|
|
162
|
-
>
|
|
116
|
+
> _The rule of thumb is simple: skill for workflows, tool-cli for one-shots, code_execute for computation. The three are not competing. They are collaborating._
|
|
163
117
|
|
|
164
118
|
---
|
|
165
119
|
|
|
166
120
|
## The Architecture
|
|
167
121
|
|
|
168
|
-
The three tiers are complementary. Skills give curated access with workflow knowledge. The Football gives interactive access with safety. Code Mode gives autonomous access to safe operations at scale.
|
|
169
|
-
|
|
170
122
|
```mermaid
|
|
171
123
|
flowchart TD
|
|
172
124
|
subgraph mcpi["mcpi (agent)"]
|
|
@@ -185,66 +137,62 @@ flowchart TD
|
|
|
185
137
|
|
|
186
138
|
The harness controls what the model sees. MCP servers just expose their tools and skills. The extension decides _when_ and _how_ to reveal them.
|
|
187
139
|
|
|
140
|
+
### Every call flows through the harness
|
|
141
|
+
|
|
142
|
+
All three tiers route MCP tool calls back through the extension process. This is a subtle but important property: even when the model writes sandboxed JavaScript (Code Mode) or shells out to `tool-cli`, the actual MCP call happens in the harness. This means:
|
|
143
|
+
|
|
144
|
+
- **Every tool invocation appears in the agent log** — skills, tool-cli one-shots, and Code Mode sandbox calls alike. Full observability without instrumentation.
|
|
145
|
+
- **Human-in-the-loop can be added at one point** — the `McpClientManager` is the single choke point. Future work can check tool annotations (`readOnlyHint`, `destructiveHint`) and gate destructive calls through user confirmation, regardless of which tier initiated them.
|
|
146
|
+
|
|
188
147
|
> _MCP doesn't have a context problem. It never did. It was just waiting for someone to imagine the right way to read the runes._
|
|
189
148
|
|
|
190
149
|
---
|
|
191
150
|
|
|
192
151
|
## Quick Start
|
|
193
152
|
|
|
194
|
-
### Install
|
|
195
|
-
|
|
196
|
-
```sh
|
|
197
|
-
npm install @sammorrowdrums/mcpi @sammorrowdrums/mcpi-ext
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
Run mcpi with the extension:
|
|
153
|
+
### 1. Install
|
|
201
154
|
|
|
202
155
|
```sh
|
|
203
|
-
|
|
204
|
-
--mcp-config ~/.config/mcpi-ext/mcp.json
|
|
156
|
+
npm install -g @sammorrowdrums/mcpi@latest @sammorrowdrums/mcpi-ext@latest @sammorrowdrums/tool-cli@latest
|
|
205
157
|
```
|
|
206
158
|
|
|
207
|
-
###
|
|
159
|
+
### 2. Configure MCP servers
|
|
208
160
|
|
|
209
|
-
|
|
210
|
-
curl https://mise.run | sh # install mise
|
|
211
|
-
eval "$(~/.local/bin/mise activate bash)" # activate
|
|
212
|
-
mise install # install node
|
|
213
|
-
npm install # install dependencies
|
|
214
|
-
mise run build # build
|
|
215
|
-
mise run test # test
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
For local dev, override the `@sammorrowdrums/mcpi` dependency to point at your local mcpi clone:
|
|
161
|
+
Create `~/.config/mcpi-ext/mcp.json`:
|
|
219
162
|
|
|
220
163
|
```json
|
|
221
|
-
|
|
222
|
-
"
|
|
223
|
-
|
|
164
|
+
{
|
|
165
|
+
"mcpServers": {
|
|
166
|
+
"github": {
|
|
167
|
+
"type": "stdio",
|
|
168
|
+
"command": "docker",
|
|
169
|
+
"args": [
|
|
170
|
+
"run",
|
|
171
|
+
"--rm",
|
|
172
|
+
"-i",
|
|
173
|
+
"-e",
|
|
174
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN",
|
|
175
|
+
"ghcr.io/github/github-mcp-server:skill-discovery",
|
|
176
|
+
"stdio"
|
|
177
|
+
],
|
|
178
|
+
"env": {
|
|
179
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN": "xxx"
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
224
183
|
}
|
|
225
184
|
```
|
|
226
185
|
|
|
227
|
-
|
|
186
|
+
Replace `xxx` with your [GitHub personal access token](https://github.com/settings/tokens). See [github/github-mcp-server](https://github.com/github/github-mcp-server) for the standard server.
|
|
228
187
|
|
|
229
|
-
|
|
230
|
-
mcpi --extension ./dist/index.js --mcp-config ~/.config/mcpi-ext/mcp.json
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### MCP server configuration
|
|
188
|
+
> **Note:** The `skill-discovery` tag includes experimental `skill://` resources that enable Tier 1 progressive discovery. The standard `ghcr.io/github/github-mcp-server` image works too — tool-cli (Tier 2) and Code Mode (Tier 3) function with any MCP server, but skill-gated tool activation requires `skill://` resources.
|
|
234
189
|
|
|
235
|
-
|
|
190
|
+
You can add more servers — both `stdio` (spawns a process) and `remote` (Streamable HTTP) are supported:
|
|
236
191
|
|
|
237
192
|
```json
|
|
238
193
|
{
|
|
239
194
|
"mcpServers": {
|
|
240
|
-
"github": {
|
|
241
|
-
"type": "stdio",
|
|
242
|
-
"command": "npx",
|
|
243
|
-
"args": ["-y", "@modelcontextprotocol/server-github"],
|
|
244
|
-
"env": {
|
|
245
|
-
"GITHUB_PERSONAL_ACCESS_TOKEN": "xxx"
|
|
246
|
-
}
|
|
247
|
-
},
|
|
195
|
+
"github": { "...": "..." },
|
|
248
196
|
"my-remote-server": {
|
|
249
197
|
"type": "remote",
|
|
250
198
|
"url": "https://my-mcp-server.example.com/mcp",
|
|
@@ -256,7 +204,28 @@ Create `~/.config/mcpi-ext/mcp.json` (or pass `--mcp-config /path/to/config.json
|
|
|
256
204
|
}
|
|
257
205
|
```
|
|
258
206
|
|
|
259
|
-
|
|
207
|
+
### 3. Run
|
|
208
|
+
|
|
209
|
+
```sh
|
|
210
|
+
mcpi --extension $(npm root -g)/@sammorrowdrums/mcpi-ext/dist/index.js \
|
|
211
|
+
--mcp-config ~/.config/mcpi-ext/mcp.json
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Local development
|
|
215
|
+
|
|
216
|
+
```sh
|
|
217
|
+
git clone https://github.com/SamMorrowDrums/mcpi-ext.git
|
|
218
|
+
cd mcpi-ext
|
|
219
|
+
npm install
|
|
220
|
+
npm run build
|
|
221
|
+
npm test
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Then run with your local build:
|
|
225
|
+
|
|
226
|
+
```sh
|
|
227
|
+
mcpi --extension ./dist/index.js --mcp-config ~/.config/mcpi-ext/mcp.json
|
|
228
|
+
```
|
|
260
229
|
|
|
261
230
|
See [AGENTS.md](AGENTS.md) for full tooling docs, dev loop, and architecture details.
|
|
262
231
|
|
|
@@ -270,7 +239,8 @@ src/
|
|
|
270
239
|
tool-cli/ tool-cli RPC server, client, CLI binary, prompt
|
|
271
240
|
code-mode/ V8 sandbox executor, eligibility, type hints
|
|
272
241
|
test-servers/ Test MCP servers (weather, echo)
|
|
273
|
-
|
|
242
|
+
docs/ Detailed mechanism documentation
|
|
243
|
+
images/ Banner, character art, and screenshots
|
|
274
244
|
```
|
|
275
245
|
|
|
276
246
|
## License
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EAIb,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EAIb,MAAM,sBAAsB,CAAC;AAc9B,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QA8JxC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { CodeModeManager } from "./code-mode/index.js";
|
|
|
2
2
|
import { dockerE2ETool } from "./docker-e2e.js";
|
|
3
3
|
import { McpClientManager, loadMcpConfig } from "./mcp/index.js";
|
|
4
4
|
import { SkillRegistry, createLoadSkillTool, discoverSkillsFromServer, formatMcpSkillsForPrompt, registerMcpToolProxies, } from "./skills/index.js";
|
|
5
|
-
import {
|
|
5
|
+
import { ToolCliServer, formatToolCliForPrompt } from "./tool-cli/index.js";
|
|
6
6
|
export default function (pi) {
|
|
7
7
|
pi.registerTool(dockerE2ETool);
|
|
8
8
|
pi.registerFlag("mcp-config", {
|
|
@@ -11,10 +11,26 @@ export default function (pi) {
|
|
|
11
11
|
});
|
|
12
12
|
const mcpManager = new McpClientManager();
|
|
13
13
|
const skillRegistry = new SkillRegistry();
|
|
14
|
-
const rpcServer = new ToolCliRpcServer(mcpManager);
|
|
15
14
|
const codeModeManager = new CodeModeManager();
|
|
16
15
|
const enabledTools = new Set();
|
|
17
16
|
const gatedToolNames = new Set();
|
|
17
|
+
// Bridge McpClientManager to the ToolProvider interface
|
|
18
|
+
const toolProvider = {
|
|
19
|
+
getServerNames: () => mcpManager.getConnectedServers(),
|
|
20
|
+
getTools: (server) => mcpManager.getToolsForServer(server),
|
|
21
|
+
async callTool(server, tool, args) {
|
|
22
|
+
const client = mcpManager.getClient(server);
|
|
23
|
+
if (!client)
|
|
24
|
+
throw new Error(`No client for server "${server}"`);
|
|
25
|
+
const result = await client.callTool({ name: tool, arguments: args });
|
|
26
|
+
return {
|
|
27
|
+
content: result.content,
|
|
28
|
+
isError: result.isError === true ? true : undefined,
|
|
29
|
+
structuredContent: result.structuredContent,
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const rpcServer = new ToolCliServer(toolProvider);
|
|
18
34
|
// Register the load_skill tool so the model can activate MCP skills
|
|
19
35
|
pi.registerTool(createLoadSkillTool({ registry: skillRegistry, mcpManager, enabledTools }));
|
|
20
36
|
pi.on("session_start", async (_event, ctx) => {
|
|
@@ -64,7 +80,9 @@ export default function (pi) {
|
|
|
64
80
|
}
|
|
65
81
|
// Start the tool-cli RPC server for progressive tool discovery
|
|
66
82
|
try {
|
|
67
|
-
await rpcServer.start(log);
|
|
83
|
+
const { port, token } = await rpcServer.start(log);
|
|
84
|
+
pi.setEnv("TOOL_CLI_PORT", String(port));
|
|
85
|
+
pi.setEnv("TOOL_CLI_TOKEN", token);
|
|
68
86
|
}
|
|
69
87
|
catch (err) {
|
|
70
88
|
log(`[tool-cli] Failed to start RPC server: ${err.message}`);
|
|
@@ -120,6 +138,8 @@ export default function (pi) {
|
|
|
120
138
|
};
|
|
121
139
|
});
|
|
122
140
|
pi.on("session_shutdown", async () => {
|
|
141
|
+
pi.unsetEnv("TOOL_CLI_PORT");
|
|
142
|
+
pi.unsetEnv("TOOL_CLI_TOKEN");
|
|
123
143
|
await rpcServer.stop();
|
|
124
144
|
await mcpManager.disconnectAll();
|
|
125
145
|
skillRegistry.clear();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tool-cli/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { ToolCliServer } from "@sammorrowdrums/tool-cli/server";
|
|
2
|
+
export type { ToolProvider } from "@sammorrowdrums/tool-cli/server";
|
|
2
3
|
export { formatToolCliForPrompt } from "./format.js";
|
|
3
|
-
export { DEFAULT_PORT, PORT_ENV_VAR, resolvePort } from "./constants.js";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tool-cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tool-cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/tool-cli/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { ToolCliServer } from "@sammorrowdrums/tool-cli/server";
|
|
2
2
|
export { formatToolCliForPrompt } from "./format.js";
|
|
3
|
-
export { DEFAULT_PORT, PORT_ENV_VAR, resolvePort } from "./constants.js";
|
|
4
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool-cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool-cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sammorrowdrums/mcpi-ext",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
6
|
+
"@sammorrowdrums/tool-cli": "^0.3.0",
|
|
6
7
|
"isolated-vm": "^6.1.2",
|
|
7
8
|
"typebox": "^1.1.31",
|
|
8
9
|
"zod": "^4.3.6"
|
|
9
10
|
},
|
|
10
11
|
"peerDependencies": {
|
|
11
|
-
"@sammorrowdrums/mcpi": ">=0.70.
|
|
12
|
+
"@sammorrowdrums/mcpi": ">=0.70.9"
|
|
12
13
|
},
|
|
13
14
|
"devDependencies": {
|
|
14
|
-
"@sammorrowdrums/mcpi": "file:../../../repos/pi-mono/packages/coding-agent",
|
|
15
15
|
"@eslint/js": "^10.0.1",
|
|
16
|
+
"@sammorrowdrums/mcpi": "^0.70.9",
|
|
16
17
|
"@types/node": "^25.6.0",
|
|
17
18
|
"eslint": "^10.2.1",
|
|
18
19
|
"eslint-config-prettier": "^10.1.8",
|
|
@@ -29,6 +30,7 @@
|
|
|
29
30
|
"format:check": "prettier --check .",
|
|
30
31
|
"lint": "eslint .",
|
|
31
32
|
"lint:fix": "eslint --fix .",
|
|
33
|
+
"prepublishOnly": "npm run build",
|
|
32
34
|
"start": "node dist/index.js",
|
|
33
35
|
"test": "vitest --run"
|
|
34
36
|
},
|
|
@@ -36,11 +38,11 @@
|
|
|
36
38
|
"node": ">=22.13.0"
|
|
37
39
|
},
|
|
38
40
|
"description": "MCP extension for mcpi — tiered progressive tool discovery",
|
|
41
|
+
"files": [
|
|
42
|
+
"dist"
|
|
43
|
+
],
|
|
39
44
|
"license": "MIT",
|
|
40
45
|
"main": "./dist/index.js",
|
|
41
46
|
"type": "module",
|
|
42
|
-
"types": "./dist/index.d.ts"
|
|
43
|
-
"bin": {
|
|
44
|
-
"tool-cli": "./dist/tool-cli/cli.js"
|
|
45
|
-
}
|
|
47
|
+
"types": "./dist/index.d.ts"
|
|
46
48
|
}
|
package/.dockerignore
DELETED
package/.github/dependabot.yml
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
version: 2
|
|
2
|
-
|
|
3
|
-
updates:
|
|
4
|
-
- package-ecosystem: npm
|
|
5
|
-
directory: /
|
|
6
|
-
schedule:
|
|
7
|
-
interval: weekly
|
|
8
|
-
open-pull-requests-limit: 10
|
|
9
|
-
groups:
|
|
10
|
-
dev-dependencies:
|
|
11
|
-
dependency-type: development
|
|
12
|
-
update-types:
|
|
13
|
-
- minor
|
|
14
|
-
- patch
|
|
15
|
-
production-dependencies:
|
|
16
|
-
dependency-type: production
|
|
17
|
-
update-types:
|
|
18
|
-
- minor
|
|
19
|
-
- patch
|
|
20
|
-
|
|
21
|
-
- package-ecosystem: github-actions
|
|
22
|
-
directory: /
|
|
23
|
-
schedule:
|
|
24
|
-
interval: weekly
|
|
25
|
-
open-pull-requests-limit: 5
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [main]
|
|
8
|
-
|
|
9
|
-
concurrency:
|
|
10
|
-
group: ci-${{ github.ref }}
|
|
11
|
-
cancel-in-progress: true
|
|
12
|
-
|
|
13
|
-
permissions:
|
|
14
|
-
contents: read
|
|
15
|
-
models: read
|
|
16
|
-
|
|
17
|
-
jobs:
|
|
18
|
-
ci:
|
|
19
|
-
name: Lint, Build & Test
|
|
20
|
-
runs-on: ubuntu-latest
|
|
21
|
-
steps:
|
|
22
|
-
- uses: actions/checkout@v6
|
|
23
|
-
|
|
24
|
-
- uses: jdx/mise-action@v4
|
|
25
|
-
|
|
26
|
-
- name: Install dependencies
|
|
27
|
-
run: npm install
|
|
28
|
-
|
|
29
|
-
- name: Lint
|
|
30
|
-
run: mise run lint
|
|
31
|
-
|
|
32
|
-
- name: Lint Dockerfile
|
|
33
|
-
uses: hadolint/hadolint-action@v3.1.0
|
|
34
|
-
with:
|
|
35
|
-
dockerfile: Dockerfile
|
|
36
|
-
|
|
37
|
-
- name: Check formatting
|
|
38
|
-
run: mise run format:check
|
|
39
|
-
|
|
40
|
-
- name: Type-check
|
|
41
|
-
run: mise run check
|
|
42
|
-
|
|
43
|
-
- name: Build
|
|
44
|
-
run: mise run build
|
|
45
|
-
|
|
46
|
-
- name: Test
|
|
47
|
-
run: mise run test
|
|
48
|
-
|
|
49
|
-
- name: MCP integration smoke test
|
|
50
|
-
run: mise run test:integration
|
package/.hadolint.yaml
DELETED
package/.prettierignore
DELETED