kitsune-mcp 0.10.2 → 0.12.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 +93 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -71,6 +71,65 @@ Base overhead: **7 tools, ~650 tokens** ([measured](examples/benchmark.py)). Eac
|
|
|
71
71
|
|
|
72
72
|
---
|
|
73
73
|
|
|
74
|
+
## vs. always-on connectors (Claude.ai, ChatGPT, Cursor)
|
|
75
|
+
|
|
76
|
+
Most clients now offer a "connector marketplace" — Notion, Gmail, Drive, Slack, Linear, etc. — one click to enable. The catch: **every enabled connector loads its full tool surface into the system prompt of every message, for the lifetime of the conversation.** You pay for it whether you use it or not.
|
|
77
|
+
|
|
78
|
+
Kitsune is lazy and parallel: one entry, every server reachable on demand, only the tools you actively call sit in context.
|
|
79
|
+
|
|
80
|
+
### Notion, head to head (numbers measured live in this session)
|
|
81
|
+
|
|
82
|
+
| Setup | Resting context (every turn) | One Notion search | After cleanup |
|
|
83
|
+
|---|---:|---:|---:|
|
|
84
|
+
| Always-on Notion connector | **13,733 tokens** | 13,733 + reply | 13,733 forever |
|
|
85
|
+
| Kitsune — full Notion mounted | 3,000 tokens | 16,733 + reply | 3,000 |
|
|
86
|
+
| Kitsune — `shapeshift("notion-hosted", tools=["notion-search"])` | 3,000 tokens | **4,540** + reply | 3,000 (after `shiftback`) |
|
|
87
|
+
|
|
88
|
+
Over a 50-turn conversation:
|
|
89
|
+
|
|
90
|
+
- Always-on connector: 50 × 13,733 = **686,650 tokens** of repeated Notion overhead
|
|
91
|
+
- Kitsune lean: 50 × 3,000 + 5 turns × 1,540 = **157,700 tokens**
|
|
92
|
+
|
|
93
|
+
**77% reduction for the same workflow.** And Notion is just one connector.
|
|
94
|
+
|
|
95
|
+
### The "but it's just one" trap
|
|
96
|
+
|
|
97
|
+
Real-world enabled-connector token costs (typical hosted MCPs):
|
|
98
|
+
|
|
99
|
+
- Notion ~13.7K · Gmail ~8K · Drive ~10K · Slack ~7K · Calendar ~5K
|
|
100
|
+
|
|
101
|
+
**Five connectors enabled = ~43K tokens per turn**, every turn, whether you mention them or not. Same five via Kitsune lean: ~3K resting, with a brief spike only on the turn where you actually use one.
|
|
102
|
+
|
|
103
|
+
For a 100-turn dev session: 4.3M tokens of waste vs ~310K. **You can have a 14× longer conversation before hitting context limits.**
|
|
104
|
+
|
|
105
|
+
### The killer demo
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
> compare("notion")
|
|
109
|
+
|
|
110
|
+
tokens tools src status id
|
|
111
|
+
13,733 14 official live (oauth) notion-hosted
|
|
112
|
+
18,349 22 npm live @notionhq/notion-mcp-server
|
|
113
|
+
...
|
|
114
|
+
|
|
115
|
+
💡 Cheapest ready-to-use: notion-hosted
|
|
116
|
+
|
|
117
|
+
> shapeshift("notion-hosted", tools=["notion-search"])
|
|
118
|
+
✓ Mounted notion-search (~1,540 tokens)
|
|
119
|
+
|
|
120
|
+
> call("notion-search", {"query": "roadmap"})
|
|
121
|
+
[results]
|
|
122
|
+
|
|
123
|
+
> shiftback()
|
|
124
|
+
✓ Released. Context returned to baseline.
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
One tool. On demand. Off again. Same OAuth, same Notion endpoint (`mcp.notion.com/mcp`) — but tokens stay in `~/.kitsune/oauth/`, not on a third-party's servers.
|
|
128
|
+
|
|
129
|
+
> **Connectors charge rent. Kitsune charges per use.**
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
74
133
|
## Built for two audiences
|
|
75
134
|
|
|
76
135
|
### Adaptive agents
|
|
@@ -101,6 +160,23 @@ No separate web UI. No isolated test environment. Test how your server actually
|
|
|
101
160
|
|
|
102
161
|
---
|
|
103
162
|
|
|
163
|
+
## Why MCP — not a CLI skill
|
|
164
|
+
|
|
165
|
+
A CLI-based agent skill gives every agent the same surface. An MCP lets you design a completely different surface for each agent — down to the individual tool.
|
|
166
|
+
|
|
167
|
+
**1. Surgical token budgets.**
|
|
168
|
+
`shapeshift("brave-search", tools=["web_search"])` loads exactly one tool — ~300 tokens — instead of the full server schema. A specialized research agent can be wired to see only the three tools it ever needs. A coding agent sees a different three. Same underlying servers; different, purpose-built surfaces. Token overhead stays flat because context is opt-in, not always-on.
|
|
169
|
+
|
|
170
|
+
**2. On-the-fly server creation.**
|
|
171
|
+
CLI skills require something to already exist on disk. An MCP can be generated mid-session. An agent can call `craft(name, description, params, url)` to define a new tool backed by any HTTP endpoint — no install, no config change, no restart. One conversation. Any problem. New capability spun up and available to the same agent immediately.
|
|
172
|
+
|
|
173
|
+
**3. Fine-tune the surface via the Forge.**
|
|
174
|
+
`kitsune-forge` exposes the full toolkit — inspect, benchmark, craft, and test. You can prototype a tool, measure its latency, compare two competing servers, and lock in exactly the shape you want before your production agent ever sees it. The Forge is the workbench; the lean `kitsune-mcp` entry is what the agent runs with after you've dialed it in.
|
|
175
|
+
|
|
176
|
+
> The result: agents that carry only the tools they need for the current problem, can extend themselves on demand, and never waste tokens on capability they aren't using.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
104
180
|
## Two modes
|
|
105
181
|
|
|
106
182
|
| | `kitsune-mcp` | `kitsune-forge` |
|
|
@@ -291,6 +367,23 @@ Before spawning any subprocess, Kitsune MCP validates the executable name:
|
|
|
291
367
|
|
|
292
368
|
Arguments are passed directly to `asyncio.create_subprocess_exec` (never a shell), so they are not subject to shell interpretation.
|
|
293
369
|
|
|
370
|
+
### OAuth 2.1 for hosted MCP servers
|
|
371
|
+
|
|
372
|
+
Many hosted MCP servers (Notion, Linear, Cloudflare) authenticate via OAuth 2.1 with Dynamic Client Registration rather than a static API key. Kitsune supports this automatically — pass the server URL directly:
|
|
373
|
+
|
|
374
|
+
```python
|
|
375
|
+
inspect("https://mcp.notion.com/mcp")
|
|
376
|
+
# First use: browser opens, you approve, tokens are cached.
|
|
377
|
+
# Subsequent runs: cached token loaded silently, refreshed when expired.
|
|
378
|
+
|
|
379
|
+
shapeshift("https://mcp.notion.com/mcp")
|
|
380
|
+
call("notion-search", {"query": "..."})
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Kitsune probes `/.well-known/oauth-authorization-server` on the server origin; if present, it registers a client (RFC 7591) and runs the authorization code flow with PKCE S256. Tokens and client registrations are stored at `~/.kitsune/oauth/<origin>/` with mode `0600` — never in `.env`.
|
|
384
|
+
|
|
385
|
+
Headless or no-browser environments: set `KITSUNE_NO_BROWSER=1` to have Kitsune print the authorize URL for you to paste manually (a loopback listener still captures the callback).
|
|
386
|
+
|
|
294
387
|
### Credential warnings
|
|
295
388
|
|
|
296
389
|
`shapeshift()` probes tool descriptions for unreferenced environment variable patterns. If a tool mentions `BRAVE_API_KEY` and that variable isn't set, you get a warning immediately — before you call anything:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kitsune-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "The shape-shifting MCP hub — shapeshift() into 10,000+ MCP servers at runtime. One entry point, no restarts, 7 registries.",
|
|
5
5
|
"mcpName": "io.github.kaiser-data/kitsune-mcp",
|
|
6
6
|
"bin": {
|