@thenavidm/slipway 0.1.13 → 0.1.15
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/CHANGELOG.md +8 -0
- package/README.md +9 -2
- package/dist/cli/help.js +6 -4
- package/dist/search.js +5 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
What changed in Slipway, newest first.
|
|
4
4
|
|
|
5
|
+
## 0.1.15, 2026-10-05: what Adobe Firefly needed
|
|
6
|
+
|
|
7
|
+
- **The general help counts the tuning settings instead of naming them.** An agent reads `--help` first and carries it through every later step, so its length is paid again on each one. Firefly's help named 14 settings on its last line, and with only 14 commands its whole command list was shorter; its Codex CLI task cost 370 more input tokens on Slipway than on its own 2.x CLI. The line now says how many more settings there are and that `agent-context` describes each, the `--http` settings join that count, and the safety switches and the settings an app marks as setup are still named. Every server's help is shorter by the names it had on that line.
|
|
8
|
+
|
|
9
|
+
## 0.1.14, 2026-10-05: what Buffer needed
|
|
10
|
+
|
|
11
|
+
- **`which` and the search surface read what a tool takes.** Argument names count for a little less than the title and more than the description, and camelCase is split, so `channelId` reads as "channel" and `createPost` as "create post". Buffer's "schedule a post to a channel" never listed `create-post`, whose description says neither word but whose `channelId` and `schedulingType` say both; a Codex run that asked `which` then read the whole command list as well.
|
|
12
|
+
|
|
5
13
|
## 0.1.13, 2026-10-05: what Beehiiv needed
|
|
6
14
|
|
|
7
15
|
- **`jsonSchema(schema, { shareRepeats: true })` writes each repeated part of a contract schema once.** A schema generated from an API contract often spells one definition out everywhere it is used. Beehiiv's post body repeats its block styling in each of 33 block types and carries the body twice, as its own fields and as `payload`, so its create-post tool advertised 387 KB. With each repeated part under `$defs` and referred to with `$ref`, it is 40 KB, and Beehiiv's 117 tools together go from 1,684 KB to 308 KB. Nothing is lost: each part reads the same once the references are followed, Claude Code and Codex both read fields that appear only under `$defs`, and validation accepts and refuses the same arguments. Definitions take the name of the property or block type they came from, such as `paragraph` or `visual_settings`, and parts under 200 bytes stay inline. The work is linear in the schema's size and happens when the tool is first listed. `shareRepeats()` is exported for a schema built some other way.
|
package/README.md
CHANGED
|
@@ -575,17 +575,24 @@ See [CHANGELOG.md](CHANGELOG.md).
|
|
|
575
575
|
| Server | Package | Covers |
|
|
576
576
|
| --- | --- | --- |
|
|
577
577
|
| [Apple Podcasts](https://github.com/thenavidm/apple-podcasts-mcp-cli) | [`@thenavidm/apple-podcasts-mcp-cli`](https://www.npmjs.com/package/@thenavidm/apple-podcasts-mcp-cli) 2.0.0 | The catalog, charts per country, reviews and feeds, your library on this Mac with its transcript excerpts, and analytics for a show you own |
|
|
578
|
+
| [Bannerbear](https://github.com/thenavidm/bannerbear-mcp-cli) | [`@thenavidm/bannerbear-mcp-cli`](https://www.npmjs.com/package/@thenavidm/bannerbear-mcp-cli) 3.0.0 | Templates, image and animation renders, media jobs, workflows, assets, webhooks and Instant URLs, across private workspaces |
|
|
579
|
+
| [Beehiiv](https://github.com/thenavidm/beehiiv-mcp-cli) | [`@thenavidm/beehiiv-mcp-cli`](https://www.npmjs.com/package/@thenavidm/beehiiv-mcp-cli) 3.0.0 | Publications, posts and drafts, subscribers, segments, automations, custom fields, tiers, polls, referrals and webhooks |
|
|
578
580
|
| [Bluesky](https://github.com/thenavidm/bluesky-mcp-cli) | [`@thenavidm/bluesky-mcp-cli`](https://www.npmjs.com/package/@thenavidm/bluesky-mcp-cli) 2.0.0 | Posting, threads, replies, the timeline, search, feeds, lists, notifications and the social graph |
|
|
579
|
-
| [
|
|
581
|
+
| [Brandfetch](https://github.com/thenavidm/brandfetch-mcp-cli) | [`@thenavidm/brandfetch-mcp-cli`](https://www.npmjs.com/package/@thenavidm/brandfetch-mcp-cli) 3.0.0 | Any brand's logos, colors, fonts and company context, brand comparisons, transaction enrichment and approved logo downloads |
|
|
582
|
+
| [Buffer](https://github.com/thenavidm/buffer-mcp-cli) | [`@thenavidm/buffer-mcp-cli`](https://www.npmjs.com/package/@thenavidm/buffer-mcp-cli) 3.0.0 | Scheduling and publishing posts across channels, ideas, content items, tags, templates and posting limits, through Buffer's GraphQL API |
|
|
583
|
+
| [Calendly](https://github.com/thenavidm/calendly-mcp-cli) | [`@thenavidm/calendly-mcp-cli`](https://www.npmjs.com/package/@thenavidm/calendly-mcp-cli) 3.0.0 | Scheduled events and invitees, event types and availability, booking, contacts, routing forms, recaps and webhooks |
|
|
584
|
+
| [Circle](https://github.com/thenavidm/circle-mcp-cli) | [`@thenavidm/circle-mcp-cli`](https://www.npmjs.com/package/@thenavidm/circle-mcp-cli) 3.0.0 | Spaces, posts, comments, members and access groups, courses, events, payments and refunds, through the Admin API |
|
|
585
|
+
| [Cloudflare](https://github.com/thenavidm/cloudflare-mcp-cli) | [`@thenavidm/cloudflare-mcp-cli`](https://www.npmjs.com/package/@thenavidm/cloudflare-mcp-cli) 3.0.0 | Zones, DNS records with reviewed batches, cache purges, rulesets, page rules, Workers and analytics, across accounts |
|
|
580
586
|
| [Google Photos](https://github.com/thenavidm/google-photos-mcp-cli) | [`@thenavidm/google-photos-mcp-cli`](https://www.npmjs.com/package/@thenavidm/google-photos-mcp-cli) 2.0.0 | The photo picker, uploads, albums and their captions, places and maps, and media this server uploaded, across several Google accounts |
|
|
581
587
|
| [Mastodon](https://github.com/thenavidm/mastodon-mcp-cli) | [`@thenavidm/mastodon-mcp-cli`](https://www.npmjs.com/package/@thenavidm/mastodon-mcp-cli) 2.0.0 | Posting, editing, threads, timelines, search, lists, notifications and following, on any instance |
|
|
588
|
+
| [Meta Ad Library](https://github.com/thenavidm/facebook-ad-library-mcp-cli) | [`@thenavidm/facebook-ad-library-mcp-cli`](https://www.npmjs.com/package/@thenavidm/facebook-ad-library-mcp-cli) 0.6.0 | Every ad running on Facebook, Instagram and Threads for any advertiser: copy, creatives, how long each has run, what changed, and EU spend and reach |
|
|
582
589
|
| [Midjourney](https://github.com/thenavidm/midjourney-mcp-cli) | [`@thenavidm/midjourney-mcp-cli`](https://www.npmjs.com/package/@thenavidm/midjourney-mcp-cli) 2.0.0 | Generating images and video, following jobs, downloads, moodboards, the account's library and the explore feeds, through a signed-in browser |
|
|
583
590
|
| [Podcast Index](https://github.com/thenavidm/podcastindex-mcp-cli) | [`@thenavidm/podcastindex-mcp-cli`](https://www.npmjs.com/package/@thenavidm/podcastindex-mcp-cli) 2.0.0 | The open podcast directory, with the transcripts and chapters it links to fetched and read, guest histories, feed health and value-for-value |
|
|
584
591
|
| [Substack](https://github.com/thenavidm/substack-mcp-cli) | [`@thenavidm/substack-mcp-cli`](https://www.npmjs.com/package/@thenavidm/substack-mcp-cli) 3.0.0 | Drafts, publishing and scheduling, Notes, subscribers, analytics, tags, comments and researching other publications |
|
|
585
592
|
| [Teachable](https://github.com/thenavidm/teachable-mcp-cli) | [`@thenavidm/teachable-mcp-cli`](https://www.npmjs.com/package/@thenavidm/teachable-mcp-cli) 3.0.0 | Courses, users, enrollments, pricing, coupons and transactions |
|
|
586
593
|
| [Threads](https://github.com/thenavidm/threads-mcp-cli) | [`@thenavidm/threads-mcp-cli`](https://www.npmjs.com/package/@thenavidm/threads-mcp-cli) 2.0.0 | Posting, threads, carousels, replies and reply approvals, insights and keyword search |
|
|
587
|
-
| [TikTok](https://github.com/thenavidm/tiktok-mcp-cli) | [`@thenavidm/tiktok-mcp-cli`](https://www.npmjs.com/package/@thenavidm/tiktok-mcp-cli) 2.0.0 | Your own account's profile and videos, ranked by any metric, posting and drafts, through TikTok's official API |
|
|
588
594
|
| [ThriveCart](https://github.com/thenavidm/thrivecart-mcp-cli) | [`@thenavidm/thrivecart-mcp-cli`](https://www.npmjs.com/package/@thenavidm/thrivecart-mcp-cli) 3.0.0 | Products and pricing, transactions and revenue, customers, subscriptions and affiliates, across several carts |
|
|
595
|
+
| [TikTok](https://github.com/thenavidm/tiktok-mcp-cli) | [`@thenavidm/tiktok-mcp-cli`](https://www.npmjs.com/package/@thenavidm/tiktok-mcp-cli) 2.0.0 | Your own account's profile and videos, ranked by any metric, posting and drafts, through TikTok's official API |
|
|
589
596
|
| [WordPress](https://github.com/thenavidm/wordpress-mcp-cli) | [`@thenavidm/wordpress-mcp-cli`](https://www.npmjs.com/package/@thenavidm/wordpress-mcp-cli) 2.0.0 | Posts, pages, custom post types, media, terms, users and comments across several sites, plus Elementor, Rank Math, redirects and bulk edits through a helper plugin |
|
|
590
597
|
| [YouTube](https://github.com/thenavidm/youtube-mcp-cli) | [`@thenavidm/youtube-mcp-cli`](https://www.npmjs.com/package/@thenavidm/youtube-mcp-cli) 3.0.1 | Transcripts of any public video, channel research against each channel's own median, and your own channels' videos, comments and analytics |
|
|
591
598
|
|
package/dist/cli/help.js
CHANGED
|
@@ -232,8 +232,10 @@ export function renderGeneralHelp(app, bin) {
|
|
|
232
232
|
: []),
|
|
233
233
|
[app.bins.mcp, "the MCP server; --http [--port N] serves HTTP"],
|
|
234
234
|
];
|
|
235
|
-
// Tuning keeps a working default, so it is
|
|
236
|
-
// the two safety switches; agent-context says what
|
|
235
|
+
// Tuning keeps a working default, so it is counted on one line with Slipway's own settings past
|
|
236
|
+
// the two safety switches and --http's four; agent-context names each and says what it does.
|
|
237
|
+
// The general help is the first thing an agent reads, and carries it through every later step:
|
|
238
|
+
// fourteen names cost a 14-tool server more than its whole command list.
|
|
237
239
|
const tuning = [
|
|
238
240
|
...(app.definition.settings ?? []).filter((setting) => setting.tuning).map((setting) => setting.env),
|
|
239
241
|
names.surface,
|
|
@@ -257,8 +259,8 @@ export function renderGeneralHelp(app, bin) {
|
|
|
257
259
|
: []),
|
|
258
260
|
// With no tagged tool every tool is always on, so the switch would do nothing.
|
|
259
261
|
...(app.allTools.some((tool) => tool.tags.length > 0) ? [[`${names.toolsets}=a,b`, "only these toolsets, or all"]] : []),
|
|
260
|
-
[`${app.envPrefix}_HTTP_PORT / _HOST / _TOKEN / _ALLOWED_ORIGINS`, "for --http"],
|
|
261
262
|
];
|
|
263
|
+
const more = tuning.length + 4;
|
|
262
264
|
// The list formats appear in the help of the commands that list; flags that cannot apply
|
|
263
265
|
// here (jobs, the cache) are left out. agent-context lists every one.
|
|
264
266
|
const flags = GLOBAL_FLAGS.map(([flag]) => flag).filter((flag) => flag !== "--agent" &&
|
|
@@ -282,7 +284,7 @@ export function renderGeneralHelp(app, bin) {
|
|
|
282
284
|
``,
|
|
283
285
|
`Settings:`,
|
|
284
286
|
...settings.map(settingRow),
|
|
285
|
-
`
|
|
287
|
+
` And ${more} more, for tuning and --http: agent-context describes each.`,
|
|
286
288
|
``,
|
|
287
289
|
`Exit codes: ${EXIT.ok} ok, ${EXIT.error} unexpected, ${EXIT.usage} usage or refused, ${EXIT.notFound} not found, ${EXIT.auth} auth, ${EXIT.api} API, ${EXIT.rateLimited} rate limited, ${EXIT.notConfigured} not configured`,
|
|
288
290
|
``,
|
package/dist/search.js
CHANGED
|
@@ -12,6 +12,8 @@ const STOP_WORDS = new Set([
|
|
|
12
12
|
]);
|
|
13
13
|
function words(text) {
|
|
14
14
|
return text
|
|
15
|
+
// camelCase splits, so `channelId` reads as "channel id" and `createPost` as "create post".
|
|
16
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
15
17
|
.toLowerCase()
|
|
16
18
|
.split(/[^a-z0-9]+/)
|
|
17
19
|
.filter((word) => word.length > 1)
|
|
@@ -91,11 +93,13 @@ export function searchTools(tools, query, limit = 10, synonyms = {}) {
|
|
|
91
93
|
const title = words(tool.title);
|
|
92
94
|
const tags = tool.tags.flatMap(words);
|
|
93
95
|
const description = words(tool.description);
|
|
96
|
+
// What a tool takes says what it is for: `channelId` and `schedulingType` find the post tool for "schedule a post to a channel".
|
|
97
|
+
const args = Object.keys(tool.jsonSchema.properties ?? {}).filter((key) => key !== "confirm").flatMap(words);
|
|
94
98
|
let score = 0;
|
|
95
99
|
let matched = 0;
|
|
96
100
|
for (const term of terms) {
|
|
97
101
|
// A term that is the tool's name is not a hint, it is the answer.
|
|
98
|
-
const got = (named(tool, term) ? 20 : 0) + hits(term, name, extra) * 5 + hits(term, title, extra) * 4 + hits(term, tags, extra) * 3 + hits(term, description, extra);
|
|
102
|
+
const got = (named(tool, term) ? 20 : 0) + hits(term, name, extra) * 5 + hits(term, title, extra) * 4 + hits(term, tags, extra) * 3 + hits(term, args, extra) * 2 + hits(term, description, extra);
|
|
99
103
|
if (got > 0)
|
|
100
104
|
matched++;
|
|
101
105
|
score += got;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thenavidm/slipway",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"description": "Slipway, the TypeScript framework for MCP servers and agent-native CLIs. One tool definition ships an MCP server and a CLI, with write safety, typed results and release checks built in.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|