Skip to main content
MCP Apps SDK
import { App } from "@modelcontextprotocol/ext-apps";

Overview

listServerResources retrieves the list of resources available on the originating MCP server. The request is proxied through the host. Use this to discover what resources exist before reading them with readServerResource. Results may be paginated. When more resources are available, the response includes a nextCursor field that can be passed in subsequent calls to fetch the next page.

Signature

async listServerResources(
  params?: { cursor?: string },
  options?: RequestOptions,
): Promise<ListResourcesResult>

Parameters

params
object
cursor
string
Pagination cursor returned from a previous listServerResources call. Omit for the first request.
options
RequestOptions
Optional request configuration such as timeout or abort signal.

Returns

ListResourcesResult
object
resources
Resource[]
Array of available resources. Each resource includes uri, name, and optionally description and mimeType.
nextCursor
string
Pagination cursor. Present when more resources are available. Pass this value as cursor in the next call to retrieve the next page.

Usage

Listing all resources

const result = await app.listServerResources();

for (const resource of result.resources) {
  console.log(resource.name, resource.uri, resource.mimeType);
}

Paginating through all resources

async function fetchAllResources() {
  const allResources = [];
  let cursor: string | undefined;

  do {
    const result = await app.listServerResources(
      cursor ? { cursor } : undefined,
    );
    allResources.push(...result.resources);
    cursor = result.nextCursor;
  } while (cursor);

  return allResources;
}

Building a resource picker

const result = await app.listServerResources();

const list = document.getElementById("resource-list");
for (const resource of result.resources) {
  const item = document.createElement("li");
  item.textContent = resource.name;
  item.addEventListener("click", async () => {
    const data = await app.readServerResource({ uri: resource.uri });
    renderContent(data.contents);
  });
  list.appendChild(item);
}