@yawlabs/mcp 0.58.3 → 0.58.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/dist/index.js +41 -49
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2771,7 +2771,7 @@ function selectFlakyNamespaces(entries, limit) {
|
|
|
2771
2771
|
}
|
|
2772
2772
|
|
|
2773
2773
|
// src/doctor-cmd.ts
|
|
2774
|
-
var VERSION = true ? "0.58.
|
|
2774
|
+
var VERSION = true ? "0.58.4" : "dev";
|
|
2775
2775
|
async function runDoctor(opts = {}) {
|
|
2776
2776
|
if (opts.json) return runDoctorJson(opts);
|
|
2777
2777
|
const lines = [];
|
|
@@ -2852,10 +2852,8 @@ async function runDoctor(opts = {}) {
|
|
|
2852
2852
|
let exitCode = 0;
|
|
2853
2853
|
if (config.token === null) {
|
|
2854
2854
|
print("DIAGNOSIS");
|
|
2855
|
-
print(" Local mode (Free)
|
|
2855
|
+
print(" Local mode (Free) -- fully functional, no account needed. yaw-mcp serves");
|
|
2856
2856
|
print(" whatever servers are configured locally in ~/.yaw-mcp/bundles.json.");
|
|
2857
|
-
print(" Sign in with `yaw-mcp login` (or set YAW_MCP_TOKEN) to add account-synced");
|
|
2858
|
-
print(" servers and compliance grades.");
|
|
2859
2857
|
} else if (config.warnings.length > 0) {
|
|
2860
2858
|
exitCode = 2;
|
|
2861
2859
|
print("DIAGNOSIS");
|
|
@@ -2930,7 +2928,7 @@ async function runDoctorJson(opts) {
|
|
|
2930
2928
|
let exitCode = 0;
|
|
2931
2929
|
let summary;
|
|
2932
2930
|
if (config.token === null) {
|
|
2933
|
-
summary = "Local mode (Free)
|
|
2931
|
+
summary = "Local mode (Free) -- fully functional, no account needed.";
|
|
2934
2932
|
} else if (config.warnings.length > 0) {
|
|
2935
2933
|
exitCode = 2;
|
|
2936
2934
|
summary = "Token present, but warnings need attention.";
|
|
@@ -3444,7 +3442,7 @@ function closestNames(query, candidates, limit) {
|
|
|
3444
3442
|
// src/login-cmd.ts
|
|
3445
3443
|
var LOGIN_USAGE = `Usage: yaw-mcp login --key <license-key>
|
|
3446
3444
|
|
|
3447
|
-
Sign in to your Yaw Team
|
|
3445
|
+
Sign in to your Yaw Team account. Your license
|
|
3448
3446
|
key was emailed after purchase.
|
|
3449
3447
|
|
|
3450
3448
|
--key <license-key> Required. The license key from your purchase email.
|
|
@@ -3520,7 +3518,7 @@ async function runLogin(opts, io = {
|
|
|
3520
3518
|
// src/logout-cmd.ts
|
|
3521
3519
|
var LOGOUT_USAGE = `Usage: yaw-mcp logout
|
|
3522
3520
|
|
|
3523
|
-
Sign out of your Yaw Team
|
|
3521
|
+
Sign out of your Yaw Team account. Clears the
|
|
3524
3522
|
local session cookie at ~/.yaw-mcp/team-session.json. Free mode
|
|
3525
3523
|
resumes on the next yaw-mcp invocation if no YAW_MCP_TOKEN is set.
|
|
3526
3524
|
|
|
@@ -3651,33 +3649,27 @@ async function showNagInterstitial(opts = {}) {
|
|
|
3651
3649
|
const stdin = opts.stdin ?? process.stdin;
|
|
3652
3650
|
const tty = opts.isTTY ?? (stdout.isTTY === true && stdin.isTTY === true);
|
|
3653
3651
|
if (!tty) return;
|
|
3654
|
-
const
|
|
3652
|
+
const content = [
|
|
3653
|
+
"Yaw MCP -- support the project",
|
|
3655
3654
|
"",
|
|
3656
|
-
"
|
|
3657
|
-
"
|
|
3658
|
-
"
|
|
3659
|
-
"
|
|
3660
|
-
"
|
|
3661
|
-
"
|
|
3662
|
-
"
|
|
3663
|
-
"
|
|
3664
|
-
"
|
|
3665
|
-
"
|
|
3666
|
-
"
|
|
3667
|
-
"
|
|
3668
|
-
"| Yaw Team ($15/seat/mo or $150/seat/yr) adds: |",
|
|
3669
|
-
"| * everything in Pro, per seat |",
|
|
3670
|
-
"| * shared team bundles |",
|
|
3671
|
-
"| * shared org secrets |",
|
|
3672
|
-
"| * per-seat audit log |",
|
|
3673
|
-
"| * SSO |",
|
|
3674
|
-
"| |",
|
|
3675
|
-
"| Learn more: https://yaw.sh/mcp |",
|
|
3676
|
-
"| |",
|
|
3677
|
-
"| Press Enter to continue (Ctrl-C to quit). |",
|
|
3678
|
-
"+----------------------------------------------------------+",
|
|
3679
|
-
""
|
|
3655
|
+
"You're using Yaw MCP free -- all features included.",
|
|
3656
|
+
"",
|
|
3657
|
+
"Working with a team? Yaw Team ($15/seat/mo or",
|
|
3658
|
+
"$150/seat/yr) adds:",
|
|
3659
|
+
" * shared team bundles across every seat",
|
|
3660
|
+
" * shared org secrets",
|
|
3661
|
+
" * per-seat audit log",
|
|
3662
|
+
" * SSO",
|
|
3663
|
+
"",
|
|
3664
|
+
"Learn more: https://yaw.sh/mcp",
|
|
3665
|
+
"",
|
|
3666
|
+
"Press Enter to continue (Ctrl-C to quit)."
|
|
3680
3667
|
];
|
|
3668
|
+
const PAD = 2;
|
|
3669
|
+
const inner = Math.max(...content.map((l) => l.length));
|
|
3670
|
+
const border = `+${"-".repeat(inner + PAD * 2)}+`;
|
|
3671
|
+
const boxed = content.map((l) => `|${" ".repeat(PAD)}${l.padEnd(inner)}${" ".repeat(PAD)}|`);
|
|
3672
|
+
const lines = ["", border, ...boxed, border, ""];
|
|
3681
3673
|
stdout.write(`${lines.join("\n")}
|
|
3682
3674
|
`);
|
|
3683
3675
|
await new Promise((resolve5) => {
|
|
@@ -4558,7 +4550,7 @@ Or re-run with --run to upgrade in place.`);
|
|
|
4558
4550
|
return { exitCode: 3, lines };
|
|
4559
4551
|
}
|
|
4560
4552
|
function readCurrentVersion() {
|
|
4561
|
-
return true ? "0.58.
|
|
4553
|
+
return true ? "0.58.4" : "dev";
|
|
4562
4554
|
}
|
|
4563
4555
|
|
|
4564
4556
|
// src/auto-upgrade.ts
|
|
@@ -4606,7 +4598,7 @@ function defaultSpawn2(cmd, args) {
|
|
|
4606
4598
|
async function maybeAutoUpgrade(deps = {}) {
|
|
4607
4599
|
const optOut = process.env.YAW_MCP_AUTO_UPGRADE;
|
|
4608
4600
|
if (optOut === "0" || optOut?.toLowerCase() === "false") return;
|
|
4609
|
-
const current = deps.currentVersion ?? (true ? "0.58.
|
|
4601
|
+
const current = deps.currentVersion ?? (true ? "0.58.4" : "dev");
|
|
4610
4602
|
if (current === "dev") return;
|
|
4611
4603
|
const method = detectInstallMethod(deps.argvPath ?? process.argv[1]);
|
|
4612
4604
|
const latest = await (deps.fetchLatestImpl ?? fetchLatestVersion2)();
|
|
@@ -5133,7 +5125,7 @@ async function reportHeartbeat(clientName, clientVersion, isRefresh = false) {
|
|
|
5133
5125
|
lastLoggedFailureStatus = null;
|
|
5134
5126
|
lastLoggedErrorMessage = null;
|
|
5135
5127
|
if (!isRefresh) {
|
|
5136
|
-
log("info", "Reported AI client connect to
|
|
5128
|
+
log("info", "Reported AI client connect to Yaw MCP", {
|
|
5137
5129
|
clientName: clientName ?? null,
|
|
5138
5130
|
clientVersion: clientVersion ?? null
|
|
5139
5131
|
});
|
|
@@ -5395,7 +5387,7 @@ async function loadLocalBundles(opts = {}) {
|
|
|
5395
5387
|
var META_TOOLS = {
|
|
5396
5388
|
discover: {
|
|
5397
5389
|
name: "mcp_connect_discover",
|
|
5398
|
-
description: 'List the MCP servers installed on the user\'s
|
|
5390
|
+
description: 'List the MCP servers installed on the user\'s Yaw MCP account and ready to use. Call this when browsing what\'s available or when the task isn\'t specific yet. If the task is already clear ("file a github issue", "query postgres", "post to slack"), prefer `mcp_connect_dispatch` \u2014 it picks the right server and loads its tools in one call. Load only the servers the CURRENT task needs; each one adds tools to your context. Shows names, namespaces, tool counts, a token-cost estimate per server (e.g. "22 tools, ~2.8k tokens") so you can budget context before activating \u2014 tilde values are estimates based on cached tool metadata, unprefixed values reflect live tool schemas. Scored servers carry an inline `[A]`\u2013`[F]` compliance grade from the Yaw MCP test suite \u2014 treat it as a trust signal and prefer higher-graded alternatives when otherwise equivalent (ungraded servers are unmarked, not penalized). Also surfaces whether each server is loaded, any local CLI it shadows (prefer the MCP tools over the CLI when a shadow is listed), and usage hints ("used Nx" or "often loaded with X") when the signals are present (counts persist across yaw-mcp restarts). Recurring packs that have been loaded together \u22652 times get their own block at the top with a ready-to-run `activate` call \u2014 skip the extra `mcp_connect_suggest` round-trip when the signal is already there. If a `yaw-mcp://guide` resource is listed, read it FIRST: it carries project/user-specific routing rules and credential conventions that override generic defaults.',
|
|
5399
5391
|
inputSchema: {
|
|
5400
5392
|
type: "object",
|
|
5401
5393
|
properties: {
|
|
@@ -5531,7 +5523,7 @@ var META_TOOLS = {
|
|
|
5531
5523
|
},
|
|
5532
5524
|
install: {
|
|
5533
5525
|
name: "mcp_connect_install",
|
|
5534
|
-
description: 'Install a new MCP server on the user\'s
|
|
5526
|
+
description: 'Install a new MCP server on the user\'s Yaw MCP account so it shows up in `mcp_connect_discover` and is ready to use. Call this when the user asks to install/add a server they don\'t already have (check `mcp_connect_discover` first \u2014 if the namespace is already listed, the server is already installed; use `mcp_connect_activate` to load its tools into this session). Fill the install spec from your knowledge of the server: for most official Model Context Protocol servers this is `{ type: "local", command: "npx", args: ["-y", "@modelcontextprotocol/server-<name>"] }`; for uvx/python it\'s `{ command: "uvx", args: ["mcp-server-<name>"] }`; for remote HTTP it\'s `{ type: "remote", url: "https://..." }`. Namespace must match /^[a-z][a-z0-9_]{0,29}$/ and must not collide with one the user already has. If the server needs secrets (API tokens, etc.) pass them in `env` \u2014 they are stored encrypted and never logged. On 403 with `code: "plan_limit_exceeded"` the user is on the free tier cap (3 servers); surface the returned error body verbatim so they see the upgrade URL. After install yaw-mcp auto-refreshes its server list \u2014 the new namespace becomes callable without a restart.',
|
|
5535
5527
|
inputSchema: {
|
|
5536
5528
|
type: "object",
|
|
5537
5529
|
properties: {
|
|
@@ -6522,7 +6514,7 @@ async function probe(name, p) {
|
|
|
6522
6514
|
// node/npx/uvx arrive as `npx.cmd` in PATH, and native spawn
|
|
6523
6515
|
// with shell:false only resolves .exe. Without this, probes
|
|
6524
6516
|
// falsely report `npx: false` on every Windows machine and
|
|
6525
|
-
//
|
|
6517
|
+
// Yaw MCP's Test button pre-flight short-circuits with
|
|
6526
6518
|
// "npx not detected" even though upstream activation (which
|
|
6527
6519
|
// goes through cross-spawn in the MCP SDK) would work fine.
|
|
6528
6520
|
// All probe args are fixed `--version` strings with no shell
|
|
@@ -6602,7 +6594,7 @@ async function reportRuntimes() {
|
|
|
6602
6594
|
if (res.statusCode >= 400 && res.statusCode !== 404) {
|
|
6603
6595
|
log("warn", "Runtime report failed", { status: res.statusCode });
|
|
6604
6596
|
} else {
|
|
6605
|
-
log("info", "Reported runtimes to
|
|
6597
|
+
log("info", "Reported runtimes to Yaw MCP", { runtimes });
|
|
6606
6598
|
}
|
|
6607
6599
|
} catch (err) {
|
|
6608
6600
|
log("warn", "Runtime report error", { error: err?.message });
|
|
@@ -7001,7 +6993,7 @@ function categorizeSpawnError(err) {
|
|
|
7001
6993
|
}
|
|
7002
6994
|
async function connectToUpstream(config, onDisconnect, onListChanged) {
|
|
7003
6995
|
const client = new Client(
|
|
7004
|
-
{ name: "yaw-mcp", version: true ? "0.58.
|
|
6996
|
+
{ name: "yaw-mcp", version: true ? "0.58.4" : "dev" },
|
|
7005
6997
|
{ capabilities: {} }
|
|
7006
6998
|
);
|
|
7007
6999
|
let transport;
|
|
@@ -7310,7 +7302,7 @@ var ConnectServer = class _ConnectServer {
|
|
|
7310
7302
|
this.apiUrl = apiUrl5;
|
|
7311
7303
|
this.token = token5;
|
|
7312
7304
|
this.server = new Server(
|
|
7313
|
-
{ name: "yaw-mcp", version: true ? "0.58.
|
|
7305
|
+
{ name: "yaw-mcp", version: true ? "0.58.4" : "dev" },
|
|
7314
7306
|
{
|
|
7315
7307
|
capabilities: {
|
|
7316
7308
|
tools: { listChanged: true },
|
|
@@ -7375,7 +7367,7 @@ var ConnectServer = class _ConnectServer {
|
|
|
7375
7367
|
activationFailures = /* @__PURE__ */ new Map();
|
|
7376
7368
|
// Session-scoped credential overrides supplied by the user via MCP
|
|
7377
7369
|
// elicitation when a server's stderr indicated a missing env var.
|
|
7378
|
-
// Cleared on shutdown — persistence belongs in the
|
|
7370
|
+
// Cleared on shutdown — persistence belongs in the Yaw MCP
|
|
7379
7371
|
// dashboard, these are a "get me running now" shortcut.
|
|
7380
7372
|
elicitedEnv = /* @__PURE__ */ new Map();
|
|
7381
7373
|
// In-flight activation promises, keyed by namespace. Dedupes
|
|
@@ -8948,7 +8940,7 @@ Use mcp_connect_discover to see imported servers.`
|
|
|
8948
8940
|
return { content: [{ type: "text", text: `Import error: ${err.message}` }], isError: true };
|
|
8949
8941
|
}
|
|
8950
8942
|
}
|
|
8951
|
-
// Install a new MCP server on the user's
|
|
8943
|
+
// Install a new MCP server on the user's Yaw MCP account. Validates
|
|
8952
8944
|
// via the shared buildInstallPayload helper so local/remote + namespace
|
|
8953
8945
|
// shape errors fail here with a clear message instead of burning a
|
|
8954
8946
|
// round-trip to the backend. On 403 plan-limit we forward the structured
|
|
@@ -9595,15 +9587,15 @@ function truncateVersion(v) {
|
|
|
9595
9587
|
import { homedir as homedir12 } from "os";
|
|
9596
9588
|
var STATS_USAGE = `Usage: yaw-mcp stats [--json] [--limit N] [--days N]
|
|
9597
9589
|
|
|
9598
|
-
Print a digest of recent AI tool calls recorded against your Yaw
|
|
9599
|
-
|
|
9590
|
+
Print a digest of recent AI tool calls recorded against your Yaw
|
|
9591
|
+
Team account.
|
|
9600
9592
|
|
|
9601
9593
|
--limit N Show the most recent N events (default 50, max 1000).
|
|
9602
9594
|
--days N Restrict to events from the last N days (default 7).
|
|
9603
9595
|
--json Emit machine-readable JSON (the full event list + summary).
|
|
9604
9596
|
|
|
9605
9597
|
Requires sign-in: \`yaw-mcp login --key <license-key>\`. Free users
|
|
9606
|
-
get a pointer to
|
|
9598
|
+
get a pointer to Yaw Team instead -- analytics requires an account.`;
|
|
9607
9599
|
function parseStatsArgs(argv) {
|
|
9608
9600
|
const opts = {};
|
|
9609
9601
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -9710,7 +9702,7 @@ async function runStats(opts, io = {
|
|
|
9710
9702
|
const home = opts.home ?? homedir12();
|
|
9711
9703
|
const session = await getSession({ home, baseUrl: opts.baseUrl });
|
|
9712
9704
|
if (!session) {
|
|
9713
|
-
const msg = "Not signed in. Yaw MCP analytics requires a
|
|
9705
|
+
const msg = "Not signed in. Yaw MCP analytics requires a Yaw Team account.\n - Yaw Team: $15/seat/mo or $150/seat/yr -- https://yaw.sh/mcp\nSign in with: yaw-mcp login --key <license-key>";
|
|
9714
9706
|
if (opts.json) io.err(`${JSON.stringify({ ok: false, error: "Not signed in.", upsell: msg })}
|
|
9715
9707
|
`);
|
|
9716
9708
|
else io.err(`yaw-mcp stats: ${msg}
|
|
@@ -9771,7 +9763,7 @@ import { dirname as dirname4, join as join11 } from "path";
|
|
|
9771
9763
|
var SYNC_USAGE = `Usage: yaw-mcp sync <push|pull|status> [--json]
|
|
9772
9764
|
|
|
9773
9765
|
Replicate ~/.yaw-mcp/bundles.json across machines via your Yaw
|
|
9774
|
-
Team
|
|
9766
|
+
Team account.
|
|
9775
9767
|
|
|
9776
9768
|
push Strip env values from the local bundles and upload the
|
|
9777
9769
|
schema to mcp_bundles. Env values stay machine-local.
|
|
@@ -10257,7 +10249,7 @@ if (subcommand === "compliance") {
|
|
|
10257
10249
|
`);
|
|
10258
10250
|
process.exit(0);
|
|
10259
10251
|
} else if (subcommand === "--version" || subcommand === "-V") {
|
|
10260
|
-
process.stdout.write(`yaw-mcp ${true ? "0.58.
|
|
10252
|
+
process.stdout.write(`yaw-mcp ${true ? "0.58.4" : "dev"}
|
|
10261
10253
|
`);
|
|
10262
10254
|
process.exit(0);
|
|
10263
10255
|
} else if (subcommand && !subcommand.startsWith("-")) {
|