kitsune-mcp 0.11.0 → 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.
Files changed (2) hide show
  1. package/README.md +93 -0
  2. 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.11.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": {