@mcp-use/client 2.0.2-canary.2 → 2.1.0-canary.3

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.
@@ -8,6 +8,8 @@
8
8
  export type { UseMcpOptions, UseMcpResult, ReconnectionOptions, McpServer, McpServerConfig,
9
9
  /** @deprecated Use McpServerConfig */
10
10
  McpServerOptions, PersistedMcpServerConfig, McpNotification, PendingSamplingRequest, PendingElicitationRequest, } from "./types.js";
11
+ export type { Skill, SkillDirectoryEntry, SkillDirectoryReadResult, SkillGetResult, SkillResource, SkillsListResult, } from "../core/skills.js";
12
+ export { SKILLS_EXTENSION_ID } from "../core/skills.js";
11
13
  export { pickPersistedServerConfig, toPersistedServerConfig } from "./types.js";
12
14
  export { useMcp } from "./useMcp.js";
13
15
  export { detectFavicon } from "../utils/favicon.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,eAAe;AACf,sCAAsC;AACtC,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EACL,GAAG,EACH,SAAS,EACT,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAG3C,YAAY,EACV,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,oBAAoB,EACpB,IAAI,EACJ,SAAS,GACV,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,sDAAsD;AACtD,MAAM,MAAM,4BAA4B,GAAG;IACzC,4BAA4B;IAC5B,MAAM,EAAE,wBAAwB,CAAC;IACjC,mCAAmC;IACnC,MAAM,EAAE,2BAA2B,CAAC;CACrC,CAAC;AACF,4DAA4D;AAC5D,YAAY,EAAE,4BAA4B,IAAI,oBAAoB,EAAE,CAAC;AACrE,2DAA2D;AAC3D,YAAY,EAAE,2BAA2B,IAAI,mBAAmB,EAAE,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,GAC1C,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,eAAe;AACf,sCAAsC;AACtC,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,KAAK,EACL,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EACL,GAAG,EACH,SAAS,EACT,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAG3C,YAAY,EACV,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,oBAAoB,EACpB,IAAI,EACJ,SAAS,GACV,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,sDAAsD;AACtD,MAAM,MAAM,4BAA4B,GAAG;IACzC,4BAA4B;IAC5B,MAAM,EAAE,wBAAwB,CAAC;IACjC,mCAAmC;IACnC,MAAM,EAAE,2BAA2B,CAAC;CACrC,CAAC;AACF,4DAA4D;AAC5D,YAAY,EAAE,4BAA4B,IAAI,oBAAoB,EAAE,CAAC;AACrE,2DAA2D;AAC3D,YAAY,EAAE,2BAA2B,IAAI,mBAAmB,EAAE,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,GAC1C,MAAM,wBAAwB,CAAC"}
@@ -251,6 +251,9 @@ var init_rpc_logger = __esm({
251
251
  }
252
252
  });
253
253
 
254
+ // src/core/skills.ts
255
+ var SKILLS_EXTENSION_ID = "io.modelcontextprotocol/skills";
256
+
254
257
  // src/react/types.ts
255
258
  var PERSISTED_SERVER_CONFIG_KEYS = [
256
259
  "url",
@@ -444,7 +447,6 @@ function runAuthPopup({
444
447
  import { useCallback as useCallback2, useEffect, useMemo, useRef, useState } from "react";
445
448
 
446
449
  // src/transport/http.ts
447
- init_logging();
448
450
  import {
449
451
  Client,
450
452
  SdkError,
@@ -489,6 +491,9 @@ var DialectJsonSchemaValidator = class {
489
491
  }
490
492
  };
491
493
 
494
+ // src/transport/http.ts
495
+ init_logging();
496
+
492
497
  // src/transport/base.ts
493
498
  init_logging();
494
499
 
@@ -1291,7 +1296,7 @@ var HttpConnector = class extends BaseConnector {
1291
1296
  is401Error = status === 401;
1292
1297
  httpStatusCode = status;
1293
1298
  if (status === 400 && streamableErr.message.includes("Missing session ID")) {
1294
- fallbackReason = "Server requires session ID (FastMCP compatibility)";
1299
+ fallbackReason = "Server requires session ID";
1295
1300
  logger.warn(`\u26A0\uFE0F ${fallbackReason}`);
1296
1301
  } else if (status === 404 || status === 405) {
1297
1302
  fallbackReason = `Server returned ${status} - server likely doesn't support streamable HTTP`;
@@ -1307,7 +1312,7 @@ var HttpConnector = class extends BaseConnector {
1307
1312
  const errorMsg = err.message || "";
1308
1313
  is401Error = detectUnauthorized(err) || errorStr.includes("401") || errorMsg.includes("Unauthorized");
1309
1314
  if (errorStr.includes("Missing session ID") || errorStr.includes("Bad Request: Missing session ID") || errorMsg.includes("FastMCP session ID error")) {
1310
- fallbackReason = "Server requires session ID (FastMCP compatibility)";
1315
+ fallbackReason = "Server requires session ID";
1311
1316
  logger.warn(`\u26A0\uFE0F ${fallbackReason}`);
1312
1317
  } else if (errorStr.includes("405 Method Not Allowed") || errorStr.includes("404 Not Found")) {
1313
1318
  fallbackReason = "Server doesn't support streamable HTTP (405/404)";
@@ -1606,7 +1611,7 @@ var HttpConnector = class extends BaseConnector {
1606
1611
  };
1607
1612
 
1608
1613
  // src/utils/version.ts
1609
- var VERSION = "2.0.2-canary.2";
1614
+ var VERSION = "2.1.0-canary.3";
1610
1615
  function getPackageVersion() {
1611
1616
  return VERSION;
1612
1617
  }
@@ -3688,6 +3693,48 @@ var MCPConnection = class {
3688
3693
  async request(method, params = null, options) {
3689
3694
  return this.connector.request(method, params, options);
3690
3695
  }
3696
+ /** List one page of skills advertised through the experimental extension. */
3697
+ async listSkills(cursor, options) {
3698
+ return await this.request(
3699
+ "skills/list",
3700
+ cursor === void 0 ? {} : { cursor },
3701
+ options
3702
+ );
3703
+ }
3704
+ /** List the complete skill catalog, following pagination defensively. */
3705
+ async listAllSkills(options) {
3706
+ const skills = [];
3707
+ const seenCursors = /* @__PURE__ */ new Set();
3708
+ let cursor;
3709
+ do {
3710
+ const page = await this.listSkills(cursor, options);
3711
+ skills.push(...Array.isArray(page.skills) ? page.skills : []);
3712
+ cursor = page.nextCursor;
3713
+ if (cursor !== void 0) {
3714
+ if (seenCursors.has(cursor)) {
3715
+ throw new Error("skills/list returned a repeated pagination cursor");
3716
+ }
3717
+ seenCursors.add(cursor);
3718
+ }
3719
+ } while (cursor !== void 0);
3720
+ return { skills };
3721
+ }
3722
+ /** Get one skill by its canonical `SKILL.md` URI. */
3723
+ async getSkill(uri, options) {
3724
+ return await this.request(
3725
+ "skills/get",
3726
+ { uri },
3727
+ options
3728
+ );
3729
+ }
3730
+ /** Read one non-recursive skill directory. */
3731
+ async readResourceDirectory(uri, cursor, options) {
3732
+ return await this.request(
3733
+ "resources/directory/read",
3734
+ cursor === void 0 ? { uri } : { uri, cursor },
3735
+ options
3736
+ );
3737
+ }
3691
3738
  };
3692
3739
 
3693
3740
  // src/telemetry/client-telemetry.ts
@@ -4648,6 +4695,28 @@ function useMcpOperations(params) {
4648
4695
  },
4649
4696
  [params.addLog]
4650
4697
  );
4698
+ const listSkills = useCallback(async () => {
4699
+ const connection = requireConnection(params, "list skills");
4700
+ params.addLog("info", "Listing skills");
4701
+ const result = await connection.listAllSkills();
4702
+ params.setSkills(result.skills);
4703
+ }, [params.addLog]);
4704
+ const getSkill = useCallback(
4705
+ async (uri) => {
4706
+ const connection = requireConnection(params, "get skill");
4707
+ params.addLog("info", `Getting skill: ${uri}`);
4708
+ return connection.getSkill(uri);
4709
+ },
4710
+ [params.addLog]
4711
+ );
4712
+ const readResourceDirectory = useCallback(
4713
+ async (uri, cursor) => {
4714
+ const connection = requireConnection(params, "read resource directory");
4715
+ params.addLog("info", `Reading resource directory: ${uri}`);
4716
+ return connection.readResourceDirectory(uri, cursor);
4717
+ },
4718
+ [params.addLog]
4719
+ );
4651
4720
  const listPrompts = useCallback(async () => {
4652
4721
  const connection = requireConnection(params, "list prompts");
4653
4722
  params.addLog("info", "Listing prompts");
@@ -4683,6 +4752,17 @@ function useMcpOperations(params) {
4683
4752
  params.addLog("warn", "Failed to refresh prompts:", error);
4684
4753
  }
4685
4754
  }, [params.addLog]);
4755
+ const refreshSkills = useCallback(async () => {
4756
+ if (params.stateRef.current !== "ready" || !params.connectionRef.current)
4757
+ return;
4758
+ try {
4759
+ const result = await params.connectionRef.current.listAllSkills();
4760
+ params.setSkills(result.skills);
4761
+ } catch (error) {
4762
+ params.setSkills([]);
4763
+ params.addLog("debug", "Skills are unavailable after refresh:", error);
4764
+ }
4765
+ }, [params.addLog]);
4686
4766
  const refreshResourceTemplates = useCallback(async () => {
4687
4767
  const connection = requireConnection(params, "refresh resource templates");
4688
4768
  const result = await connection.listResourceTemplates();
@@ -4714,10 +4794,14 @@ function useMcpOperations(params) {
4714
4794
  callTool,
4715
4795
  listResources,
4716
4796
  readResource,
4797
+ listSkills,
4798
+ getSkill,
4799
+ readResourceDirectory,
4717
4800
  listPrompts,
4718
4801
  refreshTools,
4719
4802
  refreshResources,
4720
4803
  refreshPrompts,
4804
+ refreshSkills,
4721
4805
  refreshResourceTemplates,
4722
4806
  refreshAll,
4723
4807
  getPrompt,
@@ -4917,6 +5001,7 @@ function useMcp(options) {
4917
5001
  const [resources, setResources] = useState([]);
4918
5002
  const [resourceTemplates, setResourceTemplates] = useState([]);
4919
5003
  const [prompts, setPrompts] = useState([]);
5004
+ const [skills, setSkills] = useState([]);
4920
5005
  const [serverInfo, setServerInfo] = useState(
4921
5006
  // Only use cached metadata if it has at least a name
4922
5007
  options._initialServerInfo?.name ? options._initialServerInfo : void 0
@@ -5023,6 +5108,7 @@ function useMcp(options) {
5023
5108
  setResources,
5024
5109
  setResourceTemplates,
5025
5110
  setPrompts,
5111
+ setSkills,
5026
5112
  addLog
5027
5113
  });
5028
5114
  const disconnect = useCallback2(
@@ -5059,6 +5145,7 @@ function useMcp(options) {
5059
5145
  setResources([]);
5060
5146
  setResourceTemplates([]);
5061
5147
  setPrompts([]);
5148
+ setSkills([]);
5062
5149
  setError(void 0);
5063
5150
  setAuthUrl(void 0);
5064
5151
  setAuthTokens(void 0);
@@ -5171,6 +5258,7 @@ function useMcp(options) {
5171
5258
  setResources([]);
5172
5259
  setResourceTemplates([]);
5173
5260
  setPrompts([]);
5261
+ setSkills([]);
5174
5262
  setServerInfo(void 0);
5175
5263
  setCapabilities(void 0);
5176
5264
  setProtocolEra(void 0);
@@ -5300,7 +5388,13 @@ function useMcp(options) {
5300
5388
  );
5301
5389
  } else if (notification.method === "notifications/resources/list_changed") {
5302
5390
  addLog("info", "Resources list changed, auto-refreshing...");
5303
- connectionOperations.refreshResources().catch(
5391
+ const clientInfoExtensions = mergedClientInfo.capabilities?.extensions;
5392
+ const optionExtensions = effectiveClientOptions?.capabilities?.extensions;
5393
+ const supportsSkills = optionExtensions?.[SKILLS_EXTENSION_ID] !== void 0 || clientInfoExtensions?.[SKILLS_EXTENSION_ID] !== void 0;
5394
+ Promise.all([
5395
+ connectionOperations.refreshResources(),
5396
+ ...supportsSkills ? [connectionOperations.refreshSkills()] : []
5397
+ ]).catch(
5304
5398
  (err) => addLog("warn", "Auto-refresh resources failed:", err)
5305
5399
  );
5306
5400
  } else if (notification.method === "notifications/prompts/list_changed") {
@@ -5414,6 +5508,17 @@ function useMcp(options) {
5414
5508
  setProtocolVersion(protocolVersion2);
5415
5509
  setInstructions(instructions2);
5416
5510
  setExtensions(extensions2);
5511
+ if (extensions2["io.modelcontextprotocol/skills"] !== void 0) {
5512
+ try {
5513
+ const result = await connection.listAllSkills();
5514
+ if (isMountedRef.current) setSkills(result.skills);
5515
+ } catch (error2) {
5516
+ addLog("warn", "Failed to load initial skills:", error2);
5517
+ if (isMountedRef.current) setSkills([]);
5518
+ }
5519
+ } else {
5520
+ setSkills([]);
5521
+ }
5417
5522
  }
5418
5523
  if (serverInfo2) {
5419
5524
  addLog("debug", "Server info:", serverInfo2);
@@ -6073,6 +6178,7 @@ function useMcp(options) {
6073
6178
  resources,
6074
6179
  resourceTemplates,
6075
6180
  prompts,
6181
+ skills,
6076
6182
  serverInfo,
6077
6183
  capabilities,
6078
6184
  protocolEra,
@@ -8410,15 +8516,17 @@ function ViewRendererBase({
8410
8516
  });
8411
8517
  return;
8412
8518
  }
8413
- if (event.data?.type === "iframe-console-log" && onLogRef.current) {
8414
- onLogRef.current({
8519
+ if (event.data?.type === "iframe-console-log") {
8520
+ event.stopImmediatePropagation();
8521
+ onLogRef.current?.({
8415
8522
  level: event.data.level ?? "log",
8416
8523
  data: event.data.args
8417
8524
  });
8525
+ return;
8418
8526
  }
8419
8527
  };
8420
- window.addEventListener("message", handleMessage);
8421
- return () => window.removeEventListener("message", handleMessage);
8528
+ window.addEventListener("message", handleMessage, true);
8529
+ return () => window.removeEventListener("message", handleMessage, true);
8422
8530
  }, [sandboxOrigin, isBlobSandbox]);
8423
8531
  useEffect5(() => {
8424
8532
  if (!resolved || !activeSandboxUrl) return;
@@ -8866,6 +8974,7 @@ export {
8866
8974
  LocalStorageProvider,
8867
8975
  McpClientProvider,
8868
8976
  MemoryStorageProvider,
8977
+ SKILLS_EXTENSION_ID,
8869
8978
  Tel,
8870
8979
  Telemetry,
8871
8980
  ViewRenderer,