Sample: stdio-to-HTTP bridge for AI clients that only support stdio transport
Les mainteneurs répondent en général sous 2 jours
@tiammomo y travaille déjà.
Depuis le 2/8/2026.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 68/100
Piste de recherche
Commencez par le point d’entrée proposé samples/StdioToHttpBridge et l’utilisation brute de ITransport décrite dans l’issue. Exécutez-le avec un endpoint HTTP MCP et un client stdio, en vérifiant la transmission bidirectionnelle des messages, les en-têtes API-key, les variables d’environnement et l’avertissement concernant l’insécurité. Le travail est terminé lorsque le sample connecte les deux transports de manière transparente sans implémenter lui-même la gestion du protocole.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Is your feature request related to a problem?
Many AI clients (Claude Desktop, Cursor, VS Code, etc.) only support stdio MCP servers configured as local processes. When the actual MCP server runs over Streamable HTTP (e.g. a remote or self-hosted server with API key authentication), users need a lightweight bridge process to proxy messages between the two transports.
Today there is no sample showing this pattern, so developers end up implementing HTTP manually (handling mcp-session-id, SSE parsing, notifications, error mapping, etc.) without knowing the SDK already provides everything needed.
Describe the solution you'd like
Add a samples/StdioToHttpBridge sample showing how to proxy messages transparently between StdioServerTransport and HttpClientTransport using the raw ITransport layer:
using System.CommandLine;
using ModelContextProtocol.Client;
using ModelContextProtocol.Server;
var urlOption = new Option<string>("--url", ["-u"])
{
Description = "MCP server endpoint URL. Env: MCP_URL",
DefaultValueFactory = (_) => Environment.GetEnvironmentVariable("MCP_URL") ?? string.Empty
};
var apiKeyOption = new Option<string>("--api-key", ["-k"])
{
Description = "API key for authentication. Env: MCP_API_KEY",
DefaultValueFactory = (_) => Environment.GetEnvironmentVariable("MCP_API_KEY") ?? string.Empty
};
var insecureOption = new Option<bool>("--insecure", ["-i"])
{
Description = "Disable SSL certificate validation. DANGEROUS: use only in development. Env: MCP_INSECURE",
DefaultValueFactory = (_) => Environment.GetEnvironmentVariable("MCP_INSECURE") is "1" or "true"
};
var rootCommand = new RootCommand("stdio-to-HTTP MCP bridge") { urlOption, apiKeyOption, insecureOption };
rootCommand.SetAction(async action =>
{
var mcpUrl = action.GetValue(urlOption);
var apiKey = action.GetValue(apiKeyOption);
var insecure = action.GetValue(insecureOption);
if (string.IsNullOrWhiteSpace(mcpUrl) || string.IsNullOrWhiteSpace(apiKey))
{
if (string.IsNullOrWhiteSpace(mcpUrl)) Console.Error.WriteLine("Error: --url is required.");
if (string.IsNullOrWhiteSpace(apiKey)) Console.Error.WriteLine("Error: --api-key is required.");
Environment.Exit(1);
}
if (insecure) Console.Error.WriteLine("WARNING: SSL validation is DISABLED");
var handler = insecure
? new HttpClientHandler { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }
: new HttpClientHandler();
var httpTransport = new HttpClientTransport(
new HttpClientTransportOptions
{
Endpoint = new Uri(mcpUrl!),
AdditionalHeaders = new Dictionary<string, string> { ["X-API-Key"] = apiKey! },
TransportMode = HttpTransportMode.StreamableHttp
},
new HttpClient(handler));
await using var remoteTransport = await httpTransport.ConnectAsync();
await using var stdioTransport = new StdioServerTransport("mcp-bridge");
// Proxy stdio → remote
var stdioToRemote = Task.Run(async () =>
{
await foreach (var message in stdioTransport.MessageReader.ReadAllAsync())
await remoteTransport.SendMessageAsync(message);
});
// Proxy remote → stdio
var remoteToStdio = Task.Run(async () =>
{
await foreach (var message in remoteTransport.MessageReader.ReadAllAsync())
await stdioTransport.SendMessageAsync(message);
});
await Task.WhenAny(stdioToRemote, remoteToStdio);
});
return await rootCommand.Parse(args).InvokeAsync();
Why this approach
- Transparent proxy: works at raw
ITransportlevel — all JSON-RPC messages (includinginitialize/initialized) are forwarded as-is, no double handshake - SDK handles complexity:
HttpClientTransportmanagesmcp-session-id, Streamable HTTP protocol, reconnections automatically - Authentication via
AdditionalHeaders: clean way to inject API keys or bearer tokens - Environment variable support:
MCP_URL,MCP_API_KEY,MCP_INSECUREfor container/CI use - Distributable: can be published as
PublishSingleFile=trueself-contained executable
Additional context
This is the pattern we use in cv4pve-admin to let Claude Desktop connect to our self-hosted Proxmox VE MCP server over HTTPS with API key authentication.
- Langage dominant
- C#
- Étoiles
- 4.6k
- Forks
- 852
- Merge moyen
- 9 j 3 h
- PR mergées (30 j)
- 3
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de modelcontextprotocol/csharp-sdk
-
Reserved URI-template expansion throws for supplementary Unicode charactersPeut-être pris @pournasserian l’a pris il y a 5 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
modelcontextprotocol/csharp-sdk#1913 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
ClaimsPrincipal parameter injection sample requestPeut-être pris @utsavjain2809 l’a pris il y a 15 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
modelcontextprotocol/csharp-sdk#1899 ·
Les mainteneurs répondent en général sous 2 jours
-
Document ClientOAuthOptions.ScopeSelector usagePeut-être pris @z0rimo l’a pris il y a 38 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
modelcontextprotocol/csharp-sdk#1867 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
HTTP+SSE client: POST responses are never disposed, leaking one connection per sent messagePeut-être pris @yalcinfu22 l’a pris il y a 53 jours. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
modelcontextprotocol/csharp-sdk#1840 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
enhancement needs confirmation
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
modelcontextprotocol/csharp-sdk#678 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de modelcontextprotocol/csharp-sdk
Issues similaires
-
status:waiting-for-triage type:bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 84/100
microsoftgraph/msgraph-sdk-dotnet#3194 ·
Les mainteneurs répondent en général sous 1 jour
-
Backend enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
Les mainteneurs répondent en général sous 1 jour
-
UI: money shows the minus sign next to the number, not before the currency (IL -3.0m, not -IL 3.0m)Ouvertearea: sim area: unity enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
eyalgolan/statecraft-israel#1107 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
dimitar-radenkov/Pointframe#271 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
qew21/Genshin-Subtitles#45 ·