Skip to content

Stdio SubscribeToResourceAsync Hangs #711

@MadEste

Description

@MadEste

Describe the bug
Client.SubscribeToResourceAsync hangs. I am able to successfully subscribe using SendMessageAsync instead.

To Reproduce
Steps to reproduce the behavior:

// Create a client capable of subscribing to resources
bool resourceUpdated = false;
McpClientOptions clientOptions = new()
{
    Capabilities = new()
    {
        NotificationHandlers = new List<KeyValuePair<string, Func<JsonRpcNotification, CancellationToken, ValueTask>>>
        {
            new KeyValuePair<string, Func<JsonRpcNotification, CancellationToken, ValueTask>>(
                NotificationMethods.ResourceUpdatedNotification, (notification, cancellationToken) =>
                {
                    resourceUpdated = true;
                    return new ValueTask(Task.CompletedTask);
                })
        },
    }
};

await LaunchMcpClient(clientOptions);

// Query the servers resources
Verify.IsNotNull(Client?.ServerCapabilities?.Resources);
Verify.IsTrue(Client!.ServerCapabilities!.Resources!.Subscribe == true);

await Client!.SubscribeToResourceAsync("test://text/resource1");
builder.Services.AddMcpServer(options =>
{
    if (options.Capabilities?.Resources is not null)
    {
        options.Capabilities.Resources.Subscribe = true;
        options.Capabilities.Resources.SubscribeToResourcesHandler = (notification, cancellationToken) =>
        {
            if (notification.Params?.Uri is not null)
            {
                subscriptions.Add(notification.Params?.Uri!);
            }

            return new ValueTask<EmptyResult>();
        };

        options.Capabilities.Resources.UnsubscribeFromResourcesHandler = (notification, cancellationToken) =>
        {
            if (notification.Params?.Uri is not null)
            {
                subscriptions.Remove(notification.Params?.Uri!);
            }

            return new ValueTask<EmptyResult>();
        };

    }
    else
    {
        Environment.FailFast("StdioTestServer capabilities were not properly configured.");
    }
})

Additional context
I added subscribe handlers through callback instead of builder extensions because of #656

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions