Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions samples/FileBasedMcpServer/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env -S dotnet run --
#:package Microsoft.Extensions.Hosting
#:project ../../src/ModelContextProtocol/ModelContextProtocol.csproj

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Server;
using System.ComponentModel;

var builder = Host.CreateApplicationBuilder(args);

builder.Services.AddMcpServer()
.WithStdioServerTransport()
.WithTools<EchoTool>();

builder.Logging.AddConsole(options =>
{
options.LogToStandardErrorThreshold = LogLevel.Trace;
});

await builder.Build().RunAsync();

// File-scoped tool class
[McpServerToolType]
file class EchoTool
{
[McpServerTool(Name = "echo"), Description("Echoes the message back to the client.")]
public static string Echo([Description("The message to echo back.")] string message) => $"Echo: {message}";
}
64 changes: 64 additions & 0 deletions samples/FileBasedMcpServer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# File-Based MCP Server Sample

This sample demonstrates how to create a complete MCP (Model Context Protocol) server using .NET 10's file-based programs feature. Unlike traditional .NET projects that require a `.csproj` file, file-based programs allow you to write and run complete applications in a single `.cs` file.

## Requirements

- .NET 10 SDK (RC2 or later)
- No project file required!

## Running the Sample

Simply run the Program.cs file directly:

```bash
dotnet run Program.cs
```

The server will start and listen for MCP messages on stdin/stdout (stdio transport).

### Making it Executable (Unix/Linux/macOS)

On Unix-like systems, you can make the file executable:

```bash
chmod +x Program.cs
./Program.cs
```

Note: The shebang line uses `/usr/bin/env` to locate `dotnet`, so ensure it's in your PATH.

## Testing the Server

You can test the server by using `@modelcontextprotocol/inspector`, any stdio-compatible client, or sending JSON-RPC messages to stdin. Here's an example:

### Initialize the server:
```bash
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0"}}}' | dotnet run Program.cs
```

### List available tools:
```bash
(
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0"}}}'
sleep 0.5
echo '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
sleep 1
) | dotnet run Program.cs 2>/dev/null | grep '^{' | jq .
```

### Call the echo tool:
```bash
(
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0"}}}'
sleep 0.5
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"echo","arguments":{"message":"Hello, MCP!"}}}'
sleep 1
) | dotnet run Program.cs 2>/dev/null | grep '^{' | jq .
```

## Reference

- [File-Based Programs Tutorial](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/tutorials/file-based-programs)
- [C# Preprocessor Directives for File-Based Apps](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives#file-based-apps)
- [Model Context Protocol Specification](https://spec.modelcontextprotocol.io/)
Loading