Table of Contents

Class McpServerToolAttribute

Namespace
ModelContextProtocol.Server
Assembly
ModelContextProtocol.Core.dll

Indicates that a method should be considered an McpServerTool.

[AttributeUsage(AttributeTargets.Method)]
public sealed class McpServerToolAttribute : Attribute
Inheritance
McpServerToolAttribute
Inherited Members

Remarks

This attribute is applied to methods that should be exposed as tools in the Model Context Protocol. When a class containing methods marked with this attribute is registered with McpServerBuilderExtensions, these methods become available as tools that can be called by MCP clients.

When methods are provided directly to McpServerTool.Create, the attribute is not required.

By default, parameters are sourced from the Arguments dictionary, which is a collection of key/value pairs, and are represented in the JSON schema for the function, as exposed in the returned McpServerTool's ProtocolTool's InputSchema. Those parameters are deserialized from the JsonElement values in that collection. There are a few exceptions to this:

All other parameters are deserialized from the JsonElements in the Arguments dictionary, using the JsonSerializerOptions supplied in SerializerOptions, or if none was provided, using DefaultOptions.

In general, the data supplied via the Arguments's dictionary is passed along from the caller and should thus be considered unvalidated and untrusted. To provide validated and trusted data to the invocation of the tool, consider having the tool be an instance method, referring to data stored in the instance, or using an instance or parameters resolved from the IServiceProvider to provide data to the method.

Return values from a method are used to create the CallToolResult that is sent back to the client:

nullReturns an empty Content list.
Microsoft.Extensions.AI.AIContentConverted to a single ContentBlock object using ToContentBlock(AIContent).
stringConverted to a single TextContentBlock object with its text set to the string value.
ContentBlockReturned as a single-item ContentBlock list.
IEnumerable<T> of stringEach string is converted to a ContentBlock object with its text set to the string value.
IEnumerable<T> of Microsoft.Extensions.AI.AIContentEach Microsoft.Extensions.AI.AIContent is converted to a ContentBlock object using ToContentBlock(AIContent).
IEnumerable<T> of ContentBlockReturned as the ContentBlock list.
CallToolResultReturned directly without modification.
Other typesSerialized to JSON and returned as a single ContentBlock object with Type set to "text".

Constructors

McpServerToolAttribute()

Initializes a new instance of the McpServerToolAttribute class.

public McpServerToolAttribute()

Properties

Destructive

Gets or sets a value that indicates whether the tool might perform destructive updates to its environment.

public bool Destructive { get; set; }

Property Value

bool

true if the tool might perform destructive updates to its environment. false if the tool performs only additive updates. The default is true.

Remarks

This property is most relevant when the tool modifies its environment (ReadOnly = false).

IconSource

Gets or sets the source URI for the tool's icon.

public string? IconSource { get; set; }

Property Value

string

Remarks

This value can be an HTTP/HTTPS URL pointing to an image file or a data URI with base64-encoded image data. When specified, a single icon will be added to the tool.

For more advanced icon configuration (multiple icons, MIME type specification, size characteristics), use Icons when creating the tool programmatically.

Idempotent

Gets or sets a value that indicates whether calling the tool repeatedly with the same arguments has no additional effect on its environment.

public bool Idempotent { get; set; }

Property Value

bool

true if calling the tool repeatedly with the same arguments has no additional effect on the environment; false if it does. The default is false.

Remarks

This property is most relevant when the tool modifies its environment (ReadOnly = false).

Name

Gets the name of the tool.

public string? Name { get; set; }

Property Value

string

Remarks

If null, the method name is used.

OpenWorld

Gets or sets a value that indicates whether this tool can interact with an "open world" of external entities.

public bool OpenWorld { get; set; }

Property Value

bool

true if the tool can interact with an unpredictable or dynamic set of entities (like web search). false if the tool's domain of interaction is closed and well-defined (like memory access). The default is true.

ReadOnly

Gets or sets a value that indicates whether this tool does not modify its environment.

public bool ReadOnly { get; set; }

Property Value

bool

true if the tool only performs read operations without changing state. false if the tool might make modifications to its environment. The default is false.

Remarks

Read-only tools do not have side effects beyond computational resource usage. They don't create, update, or delete data in any system.

Title

Gets or sets a human-readable title for the tool that can be displayed to users.

public string? Title { get; set; }

Property Value

string

Remarks

The title provides a more descriptive, user-friendly name for the tool than the tool's programmatic name. It is intended for display purposes and to help users understand the tool's purpose at a glance.

Unlike the tool name (which follows programmatic naming conventions), the title can include spaces, special characters, and be phrased in a more natural language style.

UseStructuredContent

Gets or sets a value that indicates whether the tool should report an output schema for structured content.

public bool UseStructuredContent { get; set; }

Property Value

bool

The default is false.

Remarks

When enabled, the tool will attempt to populate the OutputSchema and provide structured content in the StructuredContent property.