Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/project-structure/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ an MCP server, the request/response lifecycle, and a set of state stores.
| `core/mcp/state/` | The stores `core/react/` hooks read |
| `core/auth/` | OAuth end to end — providers, discovery, storage, endpoint overrides, scopes, revocation, mid-session recovery — split into isomorphic logic plus `browser/`, `node/` and `remote/` backends |
| `core/auth/node/` | Node OAuth storage + loopback callback server, **and** the `SecretStore` backends (keychain / file / memory) and their selection policy |
| `core/extension/<name>/` | Host-side adapters for MCP extensions whose protocol an upstream SDK owns. `tasks/` wraps `@modelcontextprotocol/ext-tasks` with what that package leaves to its host: the raw `rawDispatch` channel, progress routing, error identity, and task-view conversions. Imports nothing from `InspectorClient`; host state arrives through narrow interfaces |
| `core/extension/<name>/` | Host-side adapters for MCP extensions whose protocol an upstream SDK owns. `tasks/` wraps `@modelcontextprotocol/ext-tasks` with what that package leaves to its host: the raw `rawDispatch` channel, progress routing, error identity, and task-view conversions. `skills/` keeps what `@modelcontextprotocol/client/ext/skills` leaves to an inspector: permissive entry schemas (the SDK's refuse a non-conforming entry), the per-check conformance and verification report, and `SKILL.md` frontmatter parsing; constants, limits and the directory-read schema come from the SDK. Imports nothing from `InspectorClient`; host state arrives through narrow interfaces |
| `core/cli/` | Node-only surface the one-shot CLI and `mcpdo` both run on (#2461): `error-handler` (exit codes, `CliExitCodeError`, the error envelope), the method handlers and their option/format types (`handlers/`), the interactive OAuth connect flow (`cliOAuth`, `cli-oauth-navigation`) and output helpers (`style`, `utils/awaitable-log`). One-shot-only output (`emit-result`, `consume-outcome`, `servers-write`, …) stays in `clients/cli/src` |
| `core/client/` | Install-level client config (`client.json`): browser-safe parse plus Node load/save, remote backend, secrets, runner |
| `core/json/` | JSON + parameter/argument conversion; the schema normalizations all three form builders share (nullable unions, root composition) and the tool-schema portability lint |
Expand Down
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ inspector/
│ │ exit codes, interactive OAuth flow, output styling); tested + gated by clients/cli
│ ├── client/ Install-level client config (`client.json`)
│ ├── extension/ Host-side adapters for MCP extensions whose protocol an upstream SDK owns
│ │ ├── skills/ What the SDK's Skills client leaves to an inspector: permissive entry schemas, the
│ │ │ per-check conformance + verification report, SKILL.md frontmatter parsing
│ │ └── tasks/ The Inspector's glue around `@modelcontextprotocol/ext-tasks` (raw dispatch, progress routing)
│ ├── json/ JSON/schema utilities shared by all three form builders
│ ├── logging/ Silent pino logger singleton
Expand Down
6 changes: 3 additions & 3 deletions clients/cli/__tests__/run-method-skills.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import {
} from "@inspector/core/cli/handlers/skills-verify.js";
import { EXIT_CODES } from "@inspector/core/cli/error-handler.js";
import type { InspectorClient } from "@inspector/core/mcp/index.js";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas.js";
import { sha256Digest } from "@inspector/core/mcp/skills.js";
import type { SkillVerifyReport } from "@inspector/core/mcp/skillsVerification.js";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas.js";
import { sha256Digest } from "@inspector/core/extension/skills/conformance.js";
import type { SkillVerifyReport } from "@inspector/core/extension/skills/verification.js";

/**
* The three SEP-2640 methods the CLI gained in #2248, plus `--verify`.
Expand Down
2 changes: 1 addition & 1 deletion clients/cli/__tests__/skills-verify-cli.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
createTestServerHttp,
createTestServerInfo,
} from "@modelcontextprotocol/inspector-test-server";
import type { SkillVerifyReport } from "@inspector/core/mcp/skillsVerification.js";
import type { SkillVerifyReport } from "@inspector/core/extension/skills/verification.js";
import { runCli } from "../src/cli.js";
import { consumeMethodOutcome } from "../src/handlers/consume-outcome.js";
import { EXIT_CODES } from "@inspector/core/cli/error-handler.js";
Expand Down
2 changes: 1 addition & 1 deletion clients/mcpdo/__tests__/skills-budget-hint.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {
createTestServerHttp,
createTestServerInfo,
} from "@modelcontextprotocol/inspector-test-server";
import type { SkillVerifyReport } from "@inspector/core/mcp/skillsVerification.js";
import type { SkillVerifyReport } from "@inspector/core/extension/skills/verification.js";
import { runMcp, type McpResult } from "./helpers/mcp-runner.js";
import {
createTestConfig,
Expand Down
7 changes: 5 additions & 2 deletions clients/tui/__tests__/SkillsTab.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ import React from "react";
import { describe, it, expect, vi } from "vitest";
import { render } from "./helpers/renderTui";
import type { InspectorClient } from "@inspector/core/mcp/index.js";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas.js";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas.js";
import { AuthRecoveryRequiredError } from "@inspector/core/auth/challenge.js";
import { sha256Digest, textToBytes } from "@inspector/core/mcp/skills.js";
import {
sha256Digest,
textToBytes,
} from "@inspector/core/extension/skills/conformance.js";

// MUST mock ink-scroll-view: the real ScrollView renders a placeholder minimap
// in the non-TTY test env and never mounts its children.
Expand Down
6 changes: 3 additions & 3 deletions clients/tui/src/components/SkillsTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,17 @@ import {
skillEntryKey,
skillUriIdentity,
type SkillIssue,
} from "@inspector/core/mcp/skills.js";
} from "@inspector/core/extension/skills/conformance.js";
import {
DYNAMIC_RESOURCES,
type SkillEntry,
} from "@inspector/core/mcp/skillsSchemas.js";
} from "@inspector/core/extension/skills/schemas.js";
import {
verifySkills,
type SkillBudgetHint,
type SkillFileReport,
type SkillVerifyReport,
} from "@inspector/core/mcp/skillsVerification.js";
} from "@inspector/core/extension/skills/verification.js";
import { useSelectableList } from "../hooks/useSelectableList.js";
import { errorMessage } from "../utils/errorText.js";
import { useListFilter } from "../hooks/useListFilter.js";
Expand Down
2 changes: 1 addition & 1 deletion clients/web/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import type {
} from "@modelcontextprotocol/client";
import { InspectorClient } from "@inspector/core/mcp/index.js";
import { getServerType } from "@inspector/core/mcp/config.js";
import { getSkillsExtension } from "@inspector/core/mcp/skills.js";
import { getSkillsExtension } from "@inspector/core/extension/skills/conformance.js";
import type { JsonValue } from "@inspector/core/mcp/index.js";

import type { TypedEventGeneric } from "@inspector/core/mcp/typedEventTarget.js";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {
import { useTickingClock } from "../../../hooks/useTickingClock";
import type { ListCount } from "../../../utils/listCount";
import { TASKS_EXTENSION_KEY } from "@inspector/core/extension/tasks/constants.js";
import { getSkillsExtension } from "@inspector/core/mcp/skills.js";
import { getSkillsExtension } from "@inspector/core/extension/skills/conformance.js";
import type { OAuthClientRegistrationKind } from "@inspector/core/auth/types.js";
import {
CapabilityItem,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import {
import {
isSkillCatalogLimit,
resolveSkillCatalogBudget,
} from "@inspector/core/mcp/skills.js";
} from "@inspector/core/extension/skills/conformance.js";
import type { Root } from "@modelcontextprotocol/client";

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { useState } from "react";
import type { ComponentProps } from "react";
import type { Meta, StoryObj } from "@storybook/react-vite";
import { expect, fn, userEvent, waitFor, within } from "storybook/test";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas";
import { sha256Bytes } from "@inspector/core/mcp/sha256";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas";
import { sha256Bytes } from "@inspector/core/extension/skills/sha256";
import { SkillsScreen } from "./SkillsScreen";
import type { SkillsUiState } from "./SkillsScreen";
import { EMPTY_SKILLS_UI } from "../screenUiState";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import { StrictMode, useState } from "react";
import { describe, it, expect, vi } from "vitest";
import userEvent from "@testing-library/user-event";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas";
import { sha256Digest, textToBytes } from "@inspector/core/mcp/skills";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas";
import {
sha256Digest,
textToBytes,
} from "@inspector/core/extension/skills/conformance";
import {
act,
renderWithMantine,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ import type {
DirectoryReadResult,
SkillEntry,
SkillResource,
} from "@inspector/core/mcp/skillsSchemas.js";
} from "@inspector/core/extension/skills/schemas.js";
import {
DIRECTORY_MIME_TYPE,
DYNAMIC_RESOURCES,
} from "@inspector/core/mcp/skillsSchemas.js";
} from "@inspector/core/extension/skills/schemas.js";
import {
checkSkillConformance,
checkSkillFrontmatterMatch,
Expand All @@ -44,12 +44,12 @@ import {
type SkillFileContents,
type SkillIssue,
type SkillVerification,
} from "@inspector/core/mcp/skills.js";
} from "@inspector/core/extension/skills/conformance.js";
import { CodeHighlight } from "../../elements/CodeHighlight/CodeHighlight";
import { ContentViewer } from "../../elements/ContentViewer/ContentViewer";
import { ListToggle } from "../../elements/ListToggle/ListToggle";
import { useValueChange } from "../../../hooks/useValueChange";
import { splitSkillFile } from "@inspector/core/mcp/skillFile.js";
import { splitSkillFile } from "@inspector/core/extension/skills/skillFile.js";
import {
inferMimeFromUri,
isGenericMime,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import type { ServerEntry } from "@inspector/core/mcp/types.js";
import { isTerminalStatus } from "@inspector/core/mcp/types.js";
import { isAppTool } from "@inspector/core/mcp/apps.js";
import { TASKS_EXTENSION_KEY } from "@inspector/core/extension/tasks/constants.js";
import { isSkillsExtensionSupported } from "@inspector/core/mcp/skills.js";
import { isSkillsExtensionSupported } from "@inspector/core/extension/skills/conformance.js";
import { ViewHeader } from "../../groups/ViewHeader/ViewHeader";
import { VersionBadge } from "../../elements/VersionBadge/VersionBadge";
import { CopyrightBadge } from "../../elements/CopyrightBadge/CopyrightBadge";
Expand Down
6 changes: 3 additions & 3 deletions clients/web/src/components/views/InspectorView/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ import type {
} from "../../screens/ResourcesScreen/ResourcesScreen";
import type { LogsUiState } from "../../screens/LoggingScreen/LoggingScreen";
import type { SkillsUiState } from "../../screens/SkillsScreen/SkillsScreen";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas.js";
import type { SkillFileContents } from "@inspector/core/mcp/skills.js";
import type { DirectoryReadResult } from "@inspector/core/mcp/skillsSchemas.js";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas.js";
import type { SkillFileContents } from "@inspector/core/extension/skills/conformance.js";
import type { DirectoryReadResult } from "@inspector/core/extension/skills/schemas.js";
import type { TasksUiState } from "../../screens/TasksScreen/TasksScreen";
import type { ProtocolUiState } from "../../screens/ProtocolScreen/ProtocolScreen";
import type { NetworkUiState } from "../../screens/NetworkScreen/NetworkScreen";
Expand Down
2 changes: 1 addition & 1 deletion clients/web/src/hooks/useInspectorStores.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import type {
ResourceSubscriptionStreamState,
StderrLogEntry,
} from "@inspector/core/mcp/types.js";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas.js";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas.js";
import type { InspectorClient } from "@inspector/core/mcp/index.js";
import { ManagedToolsState } from "@inspector/core/mcp/state/managedToolsState.js";
import { ManagedPromptsState } from "@inspector/core/mcp/state/managedPromptsState.js";
Expand Down
8 changes: 4 additions & 4 deletions clients/web/src/hooks/useServerCommands.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ import type {
} from "../components/screens/ToolsScreen/ToolsScreen";
import type { GetPromptState } from "../components/screens/PromptsScreen/PromptsScreen";
import type { ReadResourceState } from "../components/screens/ResourcesScreen/ResourcesScreen";
import type { SkillFileContents } from "@inspector/core/mcp/skills.js";
import type { DirectoryReadResult } from "@inspector/core/mcp/skillsSchemas.js";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas.js";
import { normalizeSkillUri } from "@inspector/core/mcp/skills.js";
import type { SkillFileContents } from "@inspector/core/extension/skills/conformance.js";
import type { DirectoryReadResult } from "@inspector/core/extension/skills/schemas.js";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas.js";
import { normalizeSkillUri } from "@inspector/core/extension/skills/conformance.js";
import { UrlElicitationErrorToastMessage } from "../components/elements/Toasts/UrlElicitationErrorToastMessage";
import {
errorCodeOf,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, it, expect } from "vitest";
import type { ServerCapabilities } from "@modelcontextprotocol/client";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas";
import { SKILLS_EXTENSION_KEY } from "@inspector/core/mcp/skillsSchemas";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas";
import { SKILLS_EXTENSION_KEY } from "@inspector/core/extension/skills/schemas";
import {
SKILL_MAX_RESOURCE_ENTRIES,
SKILL_MAX_TOTAL_BYTES,
Expand All @@ -21,7 +21,7 @@ import {
textToBytes,
totalSkillBytes,
verifySkillResource,
} from "@inspector/core/mcp/skills";
} from "@inspector/core/extension/skills/conformance";

/** The digest of the string "hello", precomputed so the assertion is a fact
* about SHA-256 rather than a restatement of what the code just did. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ import {
SKILLS_GET_METHOD,
SKILLS_LIST_METHOD,
SkillEntrySchema,
} from "@inspector/core/mcp/skillsSchemas";
} from "@inspector/core/extension/skills/schemas";
import {
ReadResourceDirectoryResultSchema,
SKILLS_EXTENSION_ID,
} from "@modelcontextprotocol/core/ext/skills";

const ENTRY = {
uri: "skill://demo/SKILL.md",
Expand All @@ -25,6 +29,15 @@ const ENTRY = {
};

describe("skills wire constants", () => {
// #2804: the SDK owns these, so a spec revision lands with an SDK bump. A
// local restatement would still pass the literal checks below.
it("takes the extension id and the directory schema from the SDK", () => {
expect(SKILLS_EXTENSION_KEY).toBe(SKILLS_EXTENSION_ID);
expect(ModernDirectoryReadResultSchema).toBe(
ReadResourceDirectoryResultSchema,
);
});

it("names the extension and its two required methods", () => {
expect(SKILLS_EXTENSION_KEY).toBe("io.modelcontextprotocol/skills");
expect(SKILLS_LIST_METHOD).toBe("skills/list");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { describe, it, expect } from "vitest";
import { sha256Bytes } from "@inspector/core/mcp/sha256";
import { sha256Digest, textToBytes } from "@inspector/core/mcp/skills";
import { sha256Bytes } from "@inspector/core/extension/skills/sha256";
import {
sha256Digest,
textToBytes,
} from "@inspector/core/extension/skills/conformance";

const hex = (bytes: Uint8Array) =>
Array.from(bytes)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { describe, it, expect } from "vitest";
import {
parseSkillFrontmatter,
splitSkillFile,
} from "@inspector/core/mcp/skillFile.js";
} from "@inspector/core/extension/skills/skillFile.js";

describe("splitSkillFile", () => {
it("separates a leading frontmatter fence from the body", () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, it, expect } from "vitest";
import { skillFileBytes } from "@inspector/core/mcp/skills.js";
import { skillFileBytes } from "@inspector/core/extension/skills/conformance.js";

describe("skillFileBytes", () => {
it("encodes a text content block as UTF-8", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import type { InspectorClientProtocol } from "@inspector/core/mcp/inspectorClien
import {
DYNAMIC_RESOURCES,
type SkillEntry,
} from "@inspector/core/mcp/skillsSchemas.js";
} from "@inspector/core/extension/skills/schemas.js";
import {
SKILL_MAX_CATALOG_SKILLS,
sha256Digest,
} from "@inspector/core/mcp/skills.js";
} from "@inspector/core/extension/skills/conformance.js";
import { AuthRecoveryRequiredError } from "@inspector/core/auth/challenge.js";
import {
allSkillsVerified,
Expand All @@ -16,7 +16,7 @@ import {
DEFAULT_SKILL_BUDGET_HINT,
utf8Length,
verifySkills,
} from "@inspector/core/mcp/skillsVerification.js";
} from "@inspector/core/extension/skills/verification.js";

/**
* `verifySkills` is the fetch-and-verify half of the SEP-2640 checks (#2248) —
Expand Down
2 changes: 1 addition & 1 deletion clients/web/src/test/core/mcp/extensions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
isAdvertisedByDefault,
} from "@inspector/core/mcp/extensions.js";
import { TASKS_EXTENSION_KEY } from "@inspector/core/extension/tasks/constants.js";
import { SKILLS_EXTENSION_KEY } from "@inspector/core/mcp/skillsSchemas.js";
import { SKILLS_EXTENSION_KEY } from "@inspector/core/extension/skills/schemas.js";

// The `ui` extension carries a non-empty advertisement value; the others are
// declared with `{}`. Spelled out here so the map assertions stay readable.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, it, expect, vi } from "vitest";
import { InspectorClient } from "@inspector/core/mcp/inspectorClient.js";
import type { ServerCapabilities } from "@modelcontextprotocol/client";
import { SKILLS_EXTENSION_KEY } from "@inspector/core/mcp/skillsSchemas.js";
import { SKILLS_EXTENSION_KEY } from "@inspector/core/extension/skills/schemas.js";
import { SdkError, SdkErrorCode } from "@modelcontextprotocol/client";

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, it, expect, beforeEach } from "vitest";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas";
import {
ManagedSkillsState,
REPEATED_CURSOR_MESSAGE,
Expand Down
2 changes: 1 addition & 1 deletion clients/web/src/test/core/react/useManagedSkills.test.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { describe, it, expect, beforeEach } from "vitest";
import { act, renderHook } from "@testing-library/react";
import type { SkillEntry } from "@inspector/core/mcp/skillsSchemas";
import type { SkillEntry } from "@inspector/core/extension/skills/schemas";
import { FakeInspectorClient } from "@inspector/core/mcp/__tests__/fakeInspectorClient";
import { ManagedSkillsState } from "@inspector/core/mcp/state/managedSkillsState";
import { useManagedSkills } from "@inspector/core/react/useManagedSkills";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import { describe, it, expect, afterEach } from "vitest";
import { InspectorClient } from "@inspector/core/mcp/inspectorClient.js";
import { createTransportNode } from "@inspector/core/mcp/node/transport.js";
import { eraToVersionNegotiation } from "@inspector/core/mcp/types.js";
import { getSkillsExtension } from "@inspector/core/mcp/skills.js";
import { getSkillsExtension } from "@inspector/core/extension/skills/conformance.js";
import { ManagedSkillsState } from "@inspector/core/mcp/state/managedSkillsState.js";
import {
allSkillsVerified,
verifySkills,
} from "@inspector/core/mcp/skillsVerification.js";
} from "@inspector/core/extension/skills/verification.js";
import {
createTestServerHttp,
type TestServerHttp,
Expand Down
2 changes: 1 addition & 1 deletion core/cli/handlers/output-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
* with a file encoding would make `--format json --output x` ambiguous.
*/
import { writeFile } from "node:fs/promises";
import { base64ToBytes } from "../../mcp/skills.js";
import { base64ToBytes } from "../../extension/skills/conformance.js";
import { CliExitCodeError, EXIT_CODES } from "../error-handler.js";
import type { McpResponse } from "./method-types.js";

Expand Down
4 changes: 2 additions & 2 deletions core/cli/handlers/run-method.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
ManagedSkillsState,
MessageLogState,
} from "../../mcp/state/index.js";
import { SKILLS_EXTENSION_KEY } from "../../mcp/skillsSchemas.js";
import { SKILLS_EXTENSION_KEY } from "../../extension/skills/schemas.js";
import { CliExitCodeError, EXIT_CODES } from "../error-handler.js";
import { collectAppInfo } from "./collect-app-info.js";
import {
Expand All @@ -20,7 +20,7 @@ import {
import {
verifySkills,
type SkillBudgetHint,
} from "../../mcp/skillsVerification.js";
} from "../../extension/skills/verification.js";
import type {
CliAppInfo,
McpResponse,
Expand Down
Loading
Loading