> ## Documentation Index
> Fetch the complete documentation index at: https://ai.easyaf.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# IMcpServerBuilder

> Extension methods for IMcpServerBuilder from ModelContextProtocol

## Definition

**Assembly:** ModelContextProtocol.dll

**Namespace:** Microsoft.Extensions.DependencyInjection

## Syntax

```csharp theme={null}
Microsoft.Extensions.DependencyInjection.IMcpServerBuilder
```

## Summary

This type is defined in ModelContextProtocol.

## Methods

### &#x20;WithODataCatalogHandlers Extension

> [!NOTE]
>
> Extension method from `Microsoft.Extensions.DependencyInjection.ODataMcp_Core_McpServerBuilderExtensions`

Adds list/call/resource/complete handlers that resolve an [ODataMcpSession](https://ai.easyaf.dev/odata-mcp/api-reference/Microsoft/OData/Mcp/Core/Catalog/ODataMcpSession.md) per request.

#### Syntax

```csharp theme={null}
public static Microsoft.Extensions.DependencyInjection.IMcpServerBuilder WithODataCatalogHandlers(Microsoft.Extensions.DependencyInjection.IMcpServerBuilder builder, System.Func<System.IServiceProvider, Microsoft.OData.Mcp.Core.Catalog.ODataMcpSession> resolveSession, System.Func<System.IServiceProvider, System.Collections.Generic.IReadOnlyList<ModelContextProtocol.Protocol.Tool>> listExtraTools = null, System.Func<ModelContextProtocol.Server.RequestContext<ModelContextProtocol.Protocol.CallToolRequestParams>, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<ModelContextProtocol.Protocol.CallToolResult>> tryHandleExtra = null, System.Func<ModelContextProtocol.Server.RequestContext<ModelContextProtocol.Protocol.CallToolRequestParams>, System.Exception, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<ModelContextProtocol.Protocol.CallToolResult>> tryHandleCallException = null, System.Func<ModelContextProtocol.Server.RequestContext<ModelContextProtocol.Protocol.CallToolRequestParams>, ModelContextProtocol.Protocol.CallToolResult, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<ModelContextProtocol.Protocol.CallToolResult>> afterInvoke = null)
```

#### Parameters

| Name | Type | Description |
| - | - | - |
| `builder` | `Microsoft.Extensions.DependencyInjection.IMcpServerBuilder` | The MCP server builder. |
| `resolveSession` | `System.Func<System.IServiceProvider, Microsoft.OData.Mcp.Core.Catalog.ODataMcpSession>` | Resolves the session for the current request. |
| `listExtraTools` | `System.Func<System.IServiceProvider, System.Collections.Generic.IReadOnlyList<ModelContextProtocol.Protocol.Tool>>?` | Optional extra tools (for example, `shutdown_server`). |
| `tryHandleExtra` | `System.Func<ModelContextProtocol.Server.RequestContext<ModelContextProtocol.Protocol.CallToolRequestParams>, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<ModelContextProtocol.Protocol.CallToolResult>>` | Optional extra call handler that runs before catalog tools. |
| `tryHandleCallException` | `System.Func<ModelContextProtocol.Server.RequestContext<ModelContextProtocol.Protocol.CallToolRequestParams>, System.Exception, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<ModelContextProtocol.Protocol.CallToolResult>>` | Optional recovery handler that sees an exception a catalog tool threw and may answer the call itself. |
| `afterInvoke` | `System.Func<ModelContextProtocol.Server.RequestContext<ModelContextProtocol.Protocol.CallToolRequestParams>, ModelContextProtocol.Protocol.CallToolResult, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<ModelContextProtocol.Protocol.CallToolResult>>` | Optional hook that sees the catalog `tools/call` result. AspNetCore uses this for URL elicitation (MRTR or Tasks). |

#### Returns

Type: `Microsoft.Extensions.DependencyInjection.IMcpServerBuilder`
The builder.

#### Exceptions

| Exception | Description |
| - | - |
| `ArgumentNullException` | Thrown when *builder* or *resolveSession* is [`null`](https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/null). |

#### Examples

```csharp theme={null}
services.AddMcpServer()
    .WithODataCatalogHandlers(provider =&gt; provider.GetRequiredService&lt;ODataMcpSession&gt;());
```

#### Remarks

*tryHandleCallException* exists so a host can recover from a failure Core has no
vocabulary for — an outbound sign-in that needs a human, for instance — without Core learning
anything about authentication: it is handed the exception and either answers the call or returns
[`null`](https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/null), in which case the original exception propagates unchanged.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.