From eab3ebf36ed0dbf208240b34c66ee931d24eb80f Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Wed, 31 Dec 2025 19:49:04 +0100 Subject: [PATCH 1/3] feat: mcp resources --- .../cmd/tui/component/prompt/autocomplete.tsx | 36 +++++++- .../opencode/src/cli/cmd/tui/context/sync.tsx | 6 ++ packages/opencode/src/mcp/index.ts | 83 +++++++++++++++++++ packages/opencode/src/server/server.ts | 21 +++++ packages/opencode/src/session/message-v2.ts | 10 ++- packages/opencode/src/session/prompt.ts | 73 ++++++++++++++++ packages/sdk/js/src/v2/gen/sdk.gen.ts | 20 +++++ packages/sdk/js/src/v2/gen/types.gen.ts | 37 ++++++++- packages/sdk/openapi.json | 40 ++++++++- 9 files changed, 322 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx index 2e68fdcd924..f5116f03702 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx @@ -231,6 +231,40 @@ export function Autocomplete(props: { }, ) + const mcpResources = createMemo(() => { + if (!store.visible || store.visible === "/") return [] + + const options: AutocompleteOption[] = [] + const width = props.anchor().width - 4 + + for (const res of Object.values(sync.data.mcp_resource)) { + options.push({ + display: Locale.truncateMiddle(`${res.name} (${res.uri})`, width), + description: res.description, + onSelect: () => { + insertPart(res.name, { + type: "file", + mime: res.mimeType ?? "text/plain", + filename: res.name, + url: res.uri, + source: { + type: "resource", + text: { + start: 0, + end: 0, + value: "", + }, + clientName: res.client, + uri: res.uri, + }, + }) + }, + }) + } + + return options + }) + const agents = createMemo(() => { const agents = sync.data.agent return agents @@ -416,7 +450,7 @@ export function Autocomplete(props: { const commandsValue = commands() const mixed: AutocompleteOption[] = ( - store.visible === "@" ? [...agentsValue, ...(filesValue || [])] : [...commandsValue] + store.visible === "@" ? [...agentsValue, ...(filesValue || []), ...mcpResources()] : [...commandsValue] ).filter((x) => x.disabled !== true) const currentFilter = filter() diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index 2528a499896..f530505fcf1 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -10,6 +10,7 @@ import type { Permission, LspStatus, McpStatus, + McpResource, FormatterStatus, SessionStatus, ProviderListResponse, @@ -62,6 +63,9 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ mcp: { [key: string]: McpStatus } + mcp_resource: { + [key: string]: McpResource + } formatter: FormatterStatus[] vcs: VcsInfo | undefined path: Path @@ -87,6 +91,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ part: {}, lsp: [], mcp: {}, + mcp_resource: {}, formatter: [], vcs: undefined, path: { state: "", config: "", worktree: "", directory: "" }, @@ -292,6 +297,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ sdk.client.command.list().then((x) => setStore("command", x.data ?? [])), sdk.client.lsp.status().then((x) => setStore("lsp", x.data!)), sdk.client.mcp.status().then((x) => setStore("mcp", x.data!)), + sdk.client.mcp.resources().then((x) => setStore("mcp_resource", x.data ?? {})), sdk.client.formatter.status().then((x) => setStore("formatter", x.data!)), sdk.client.session.status().then((x) => setStore("session_status", x.data!)), sdk.client.provider.auth().then((x) => setStore("provider_auth", x.data ?? {})), diff --git a/packages/opencode/src/mcp/index.ts b/packages/opencode/src/mcp/index.ts index 10a0636675f..97673c0878f 100644 --- a/packages/opencode/src/mcp/index.ts +++ b/packages/opencode/src/mcp/index.ts @@ -27,6 +27,17 @@ import open from "open" export namespace MCP { const log = Log.create({ service: "mcp" }) + export const Resource = z + .object({ + name: z.string(), + uri: z.string(), + description: z.string().optional(), + mimeType: z.string().optional(), + client: z.string(), + }) + .meta({ ref: "McpResource" }) + export type Resource = z.infer + export const ToolsChanged = BusEvent.define( "mcp.tools.changed", z.object({ @@ -135,6 +146,8 @@ export namespace MCP { // Prompt cache types type PromptInfo = Awaited>["prompts"][number] + type ResourceInfo = Awaited>["resources"][number] + const state = Instance.state( async () => { const cfg = await Config.get() @@ -202,6 +215,28 @@ export namespace MCP { return commands } + async function fetchResourcesForClient(clientName: string, client: Client) { + const resources = await client.listResources().catch((e) => { + log.error("failed to get prompts", { clientName, error: e.message }) + return undefined + }) + + if (!resources) { + return + } + + const commands: Record = {} + + for (const resource of resources.resources) { + const sanitizedClientName = clientName.replace(/[^a-zA-Z0-9_-]/g, "_") + const sanitizedResourceName = resource.name.replace(/[^a-zA-Z0-9_-]/g, "_") + const key = sanitizedClientName + ":" + sanitizedResourceName + + commands[key] = { ...resource, client: clientName } + } + return commands + } + export async function add(name: string, mcp: Config.Mcp) { const s = await state() const result = await create(name, mcp) @@ -539,6 +574,27 @@ export namespace MCP { return prompts } + export async function resources() { + const s = await state() + const clientsSnapshot = await clients() + + const prompts = Object.fromEntries( + ( + await Promise.all( + Object.entries(clientsSnapshot).map(async ([clientName, client]) => { + if (s.status[clientName]?.status !== "connected") { + return [] + } + + return Object.entries((await fetchResourcesForClient(clientName, client)) ?? {}) + }), + ) + ).flat(), + ) + + return prompts + } + export async function getPrompt(clientName: string, name: string, args?: Record) { const clientsSnapshot = await clients() const client = clientsSnapshot[clientName] @@ -567,6 +623,33 @@ export namespace MCP { return result } + export async function readResource(clientName: string, resourceUri: string) { + const clientsSnapshot = await clients() + const client = clientsSnapshot[clientName] + + if (!client) { + log.warn("client not found for prompt", { + clientName: clientName, + }) + return undefined + } + + const result = await client + .readResource({ + uri: resourceUri, + }) + .catch((e) => { + log.error("failed to get prompt from MCP server", { + clientName: clientName, + resourceUri: resourceUri, + error: e.message, + }) + return undefined + }) + + return result + } + /** * Start OAuth authentication flow for an MCP server. * Returns the authorization URL that should be opened in a browser. diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index f31b8ec44f5..7e6e91c6d4d 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -2257,6 +2257,27 @@ export namespace Server { return c.json(true) }, ) + .get( + "/mcp/resources", + describeRoute({ + summary: "Get MCP resources", + description: "Get all available MCP resources from connected servers.", + operationId: "mcp.resources", + responses: { + 200: { + description: "MCP resources", + content: { + "application/json": { + schema: resolver(z.record(z.string(), MCP.Resource)), + }, + }, + }, + }, + }), + async (c) => { + return c.json(await MCP.resources()) + }, + ) .get( "/lsp", describeRoute({ diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index bb78ae64ce6..ee359479e28 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -117,7 +117,15 @@ export namespace MessageV2 { ref: "SymbolSource", }) - export const FilePartSource = z.discriminatedUnion("type", [FileSource, SymbolSource]).meta({ + export const ResourceSource = FilePartSourceBase.extend({ + type: z.literal("resource"), + clientName: z.string(), + uri: z.string(), + }).meta({ + ref: "ResourceSource", + }) + + export const FilePartSource = z.discriminatedUnion("type", [FileSource, SymbolSource, ResourceSource]).meta({ ref: "FilePartSource", }) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 6bf71ef3653..82c32e5f281 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -943,6 +943,79 @@ export namespace SessionPrompt { source: part.source, }, ] + default: + // Check if this is an MCP resource + if (part.source?.type === "resource") { + const { clientName, uri } = part.source + log.info("mcp resource", { clientName, uri, mime: part.mime }) + + const pieces: MessageV2.Part[] = [ + { + id: Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: `Reading MCP resource: ${part.filename} (${uri})`, + }, + ] + + try { + const resourceContent = await MCP.readResource(clientName, uri) + if (!resourceContent) { + throw new Error(`Resource not found: ${clientName}/${uri}`) + } + + // Handle different content types + const contents = Array.isArray(resourceContent.contents) + ? resourceContent.contents + : [resourceContent.contents] + + for (const content of contents) { + if ("text" in content && content.text) { + pieces.push({ + id: Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: content.text as string, + }) + } else if ("blob" in content && content.blob) { + // Handle binary content if needed + const mimeType = "mimeType" in content ? content.mimeType : part.mime + pieces.push({ + id: Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: `[Binary content: ${mimeType}]`, + }) + } + } + + pieces.push({ + ...part, + id: part.id ?? Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + }) + } catch (error: unknown) { + log.error("failed to read MCP resource", { error, clientName, uri }) + const message = error instanceof Error ? error.message : String(error) + pieces.push({ + id: Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: `Failed to read MCP resource ${part.filename}: ${message}`, + }) + } + + return pieces + } } } diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts index b0610b64bc3..055d89f9db6 100644 --- a/packages/sdk/js/src/v2/gen/sdk.gen.ts +++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts @@ -47,6 +47,7 @@ import type { McpDisconnectResponses, McpLocalConfig, McpRemoteConfig, + McpResourcesResponses, McpStatusResponses, Part as Part2, PartDeleteErrors, @@ -2319,6 +2320,25 @@ export class Mcp extends HeyApiClient { }) } + /** + * Get MCP resources + * + * Get all available MCP resources from connected servers. + */ + public resources( + parameters?: { + directory?: string + }, + options?: Options, + ) { + const params = buildClientParams([parameters], [{ args: [{ in: "query", key: "directory" }] }]) + return (options?.client ?? this.client).get({ + url: "/mcp/resources", + ...options, + ...params, + }) + } + auth = new Auth({ client: this.client }) } diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 85a3c428625..46223d3627b 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -251,7 +251,14 @@ export type SymbolSource = { kind: number } -export type FilePartSource = FileSource | SymbolSource +export type ResourceSource = { + text: FilePartSourceText + type: "resource" + clientName: string + uri: string +} + +export type FilePartSource = FileSource | SymbolSource | ResourceSource export type FilePart = { id: string @@ -1945,6 +1952,14 @@ export type McpStatus = | McpStatusNeedsAuth | McpStatusNeedsClientRegistration +export type McpResource = { + name: string + uri: string + description?: string + mimeType?: string + client: string +} + export type LspStatus = { id: string name: string @@ -4059,6 +4074,26 @@ export type McpDisconnectResponses = { export type McpDisconnectResponse = McpDisconnectResponses[keyof McpDisconnectResponses] +export type McpResourcesData = { + body?: never + path?: never + query?: { + directory?: string + } + url: "/mcp/resources" +} + +export type McpResourcesResponses = { + /** + * MCP resources + */ + 200: { + [key: string]: McpResource + } +} + +export type McpResourcesResponse = McpResourcesResponses[keyof McpResourcesResponses] + export type LspStatusData = { body?: never path?: never diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 973c217fd18..ce43eeafb04 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -4366,6 +4366,44 @@ ] } }, + "/mcp/resources": { + "get": { + "operationId": "mcp.resources", + "parameters": [ + { + "in": "query", + "name": "directory", + "schema": { + "type": "string" + } + } + ], + "summary": "Get MCP resources", + "description": "Get all available MCP resources from connected servers.", + "responses": { + "200": { + "description": "MCP resources", + "content": { + "application/json": { + "schema": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.resources({\n ...\n})" + } + ] + } + }, "/lsp": { "get": { "operationId": "lsp.status", @@ -9561,7 +9599,7 @@ "maximum": 9007199254740991 } }, - "required": ["name", "mode", "permission", "tools", "options"] + "required": ["name", "mode", "builtIn", "permission", "tools", "options"] }, "MCPStatusConnected": { "type": "object", From c903df9b9f5898d48c9a6241abf354e335f3be1e Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Fri, 2 Jan 2026 09:32:06 +0100 Subject: [PATCH 2/3] fix: move mcp resource handling before the switch --- packages/opencode/src/session/prompt.ts | 145 ++++++++++++------------ 1 file changed, 72 insertions(+), 73 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index dd56721bbaa..b9cfd988fc3 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -792,6 +792,78 @@ export namespace SessionPrompt { const parts = await Promise.all( input.parts.map(async (part): Promise => { if (part.type === "file") { + // before checking the protocol we check if this is an mcp resource because it needs special handling + if (part.source?.type === "resource") { + const { clientName, uri } = part.source + log.info("mcp resource", { clientName, uri, mime: part.mime }) + + const pieces: MessageV2.Part[] = [ + { + id: Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: `Reading MCP resource: ${part.filename} (${uri})`, + }, + ] + + try { + const resourceContent = await MCP.readResource(clientName, uri) + if (!resourceContent) { + throw new Error(`Resource not found: ${clientName}/${uri}`) + } + + // Handle different content types + const contents = Array.isArray(resourceContent.contents) + ? resourceContent.contents + : [resourceContent.contents] + + for (const content of contents) { + if ("text" in content && content.text) { + pieces.push({ + id: Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: content.text as string, + }) + } else if ("blob" in content && content.blob) { + // Handle binary content if needed + const mimeType = "mimeType" in content ? content.mimeType : part.mime + pieces.push({ + id: Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: `[Binary content: ${mimeType}]`, + }) + } + } + + pieces.push({ + ...part, + id: part.id ?? Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + }) + } catch (error: unknown) { + log.error("failed to read MCP resource", { error, clientName, uri }) + const message = error instanceof Error ? error.message : String(error) + pieces.push({ + id: Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: `Failed to read MCP resource ${part.filename}: ${message}`, + }) + } + + return pieces + } const url = new URL(part.url) switch (url.protocol) { case "data:": @@ -1003,79 +1075,6 @@ export namespace SessionPrompt { source: part.source, }, ] - default: - // Check if this is an MCP resource - if (part.source?.type === "resource") { - const { clientName, uri } = part.source - log.info("mcp resource", { clientName, uri, mime: part.mime }) - - const pieces: MessageV2.Part[] = [ - { - id: Identifier.ascending("part"), - messageID: info.id, - sessionID: input.sessionID, - type: "text", - synthetic: true, - text: `Reading MCP resource: ${part.filename} (${uri})`, - }, - ] - - try { - const resourceContent = await MCP.readResource(clientName, uri) - if (!resourceContent) { - throw new Error(`Resource not found: ${clientName}/${uri}`) - } - - // Handle different content types - const contents = Array.isArray(resourceContent.contents) - ? resourceContent.contents - : [resourceContent.contents] - - for (const content of contents) { - if ("text" in content && content.text) { - pieces.push({ - id: Identifier.ascending("part"), - messageID: info.id, - sessionID: input.sessionID, - type: "text", - synthetic: true, - text: content.text as string, - }) - } else if ("blob" in content && content.blob) { - // Handle binary content if needed - const mimeType = "mimeType" in content ? content.mimeType : part.mime - pieces.push({ - id: Identifier.ascending("part"), - messageID: info.id, - sessionID: input.sessionID, - type: "text", - synthetic: true, - text: `[Binary content: ${mimeType}]`, - }) - } - } - - pieces.push({ - ...part, - id: part.id ?? Identifier.ascending("part"), - messageID: info.id, - sessionID: input.sessionID, - }) - } catch (error: unknown) { - log.error("failed to read MCP resource", { error, clientName, uri }) - const message = error instanceof Error ? error.message : String(error) - pieces.push({ - id: Identifier.ascending("part"), - messageID: info.id, - sessionID: input.sessionID, - type: "text", - synthetic: true, - text: `Failed to read MCP resource ${part.filename}: ${message}`, - }) - } - - return pieces - } } } From e2d5f4a2865683dffebfa9ffeecf5e1b8abfc04e Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Sun, 4 Jan 2026 15:49:23 +0100 Subject: [PATCH 3/3] fix: move endpoint to experimental --- .../opencode/src/cli/cmd/tui/context/sync.tsx | 2 +- packages/opencode/src/mcp/index.ts | 4 ++-- packages/opencode/src/server/server.ts | 6 +++--- packages/sdk/js/src/v2/gen/sdk.gen.ts | 20 +++++++++++++------ packages/sdk/js/src/v2/gen/types.gen.ts | 9 +++++---- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index 223d71a575c..8daa70b7609 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -300,7 +300,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ sdk.client.command.list().then((x) => setStore("command", reconcile(x.data ?? []))), sdk.client.lsp.status().then((x) => setStore("lsp", reconcile(x.data!))), sdk.client.mcp.status().then((x) => setStore("mcp", reconcile(x.data!))), - sdk.client.mcp.resources().then((x) => setStore("mcp_resource", reconcile(x.data ?? {}))), + sdk.client.experimental.resource.list().then((x) => setStore("mcp_resource", reconcile(x.data ?? {}))), sdk.client.formatter.status().then((x) => setStore("formatter", reconcile(x.data!))), sdk.client.session.status().then((x) => { setStore("session_status", reconcile(x.data!)) diff --git a/packages/opencode/src/mcp/index.ts b/packages/opencode/src/mcp/index.ts index dffd91c0370..fb4a8d4cf81 100644 --- a/packages/opencode/src/mcp/index.ts +++ b/packages/opencode/src/mcp/index.ts @@ -597,7 +597,7 @@ export namespace MCP { const s = await state() const clientsSnapshot = await clients() - const prompts = Object.fromEntries( + const result = Object.fromEntries( ( await Promise.all( Object.entries(clientsSnapshot).map(async ([clientName, client]) => { @@ -611,7 +611,7 @@ export namespace MCP { ).flat(), ) - return prompts + return result } export async function getPrompt(clientName: string, name: string, args?: Record) { diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 68af340d45f..3789c3239c7 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -2338,11 +2338,11 @@ export namespace Server { }, ) .get( - "/mcp/resources", + "/experimental/resource", describeRoute({ summary: "Get MCP resources", - description: "Get all available MCP resources from connected servers.", - operationId: "mcp.resources", + description: "Get all available MCP resources from connected servers. Optionally filter by name.", + operationId: "experimental.resource.list", responses: { 200: { description: "MCP resources", diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts index 0a438c30c99..81d50b28edf 100644 --- a/packages/sdk/js/src/v2/gen/sdk.gen.ts +++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts @@ -21,6 +21,7 @@ import type { EventTuiPromptAppend, EventTuiSessionSelect, EventTuiToastShow, + ExperimentalResourceListResponses, FileListResponses, FilePartInput, FileReadResponses, @@ -48,7 +49,6 @@ import type { McpDisconnectResponses, McpLocalConfig, McpRemoteConfig, - McpResourcesResponses, McpStatusResponses, Part as Part2, PartDeleteErrors, @@ -2429,26 +2429,32 @@ export class Mcp extends HeyApiClient { }) } + auth = new Auth({ client: this.client }) +} + +export class Resource extends HeyApiClient { /** * Get MCP resources * - * Get all available MCP resources from connected servers. + * Get all available MCP resources from connected servers. Optionally filter by name. */ - public resources( + public list( parameters?: { directory?: string }, options?: Options, ) { const params = buildClientParams([parameters], [{ args: [{ in: "query", key: "directory" }] }]) - return (options?.client ?? this.client).get({ - url: "/mcp/resources", + return (options?.client ?? this.client).get({ + url: "/experimental/resource", ...options, ...params, }) } +} - auth = new Auth({ client: this.client }) +export class Experimental extends HeyApiClient { + resource = new Resource({ client: this.client }) } export class Lsp extends HeyApiClient { @@ -2893,6 +2899,8 @@ export class OpencodeClient extends HeyApiClient { mcp = new Mcp({ client: this.client }) + experimental = new Experimental({ client: this.client }) + lsp = new Lsp({ client: this.client }) formatter = new Formatter({ client: this.client }) diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 9d5deeab862..5ca8fa8f6a2 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -4170,16 +4170,16 @@ export type McpDisconnectResponses = { export type McpDisconnectResponse = McpDisconnectResponses[keyof McpDisconnectResponses] -export type McpResourcesData = { +export type ExperimentalResourceListData = { body?: never path?: never query?: { directory?: string } - url: "/mcp/resources" + url: "/experimental/resource" } -export type McpResourcesResponses = { +export type ExperimentalResourceListResponses = { /** * MCP resources */ @@ -4188,7 +4188,8 @@ export type McpResourcesResponses = { } } -export type McpResourcesResponse = McpResourcesResponses[keyof McpResourcesResponses] +export type ExperimentalResourceListResponse = + ExperimentalResourceListResponses[keyof ExperimentalResourceListResponses] export type LspStatusData = { body?: never