GET /.well-known/mcp/server-card.json
SEP-1649 MCP Server Card control. Self-consistent: serverInfo + protocolVersion that matches the capabilities + transport URL that actually resolves on this same host (to a minimal MCP error stub at /mcp returning a valid JSON-RPC 'Method not found' response). Build a client against this baseline; flip hostname to chaos.catastrophic.io to exercise the failure modes.
expect: 200 OK, Content-Type: application/json. transport URL resolves to a real MCP-shaped JSON-RPC error response on this same host. X-Chaos-Origin: control. X-Chaos-Counterpart points at chaos.catastrophic.io/.well-known/mcp/server-card.json.
curl -i 'https://not.catastrophic.io/.well-known/mcp/server-card.json'
import urllib.request, json
raw = urllib.request.urlopen("https://not.catastrophic.io/.well-known/mcp/server-card.json").read()
card = json.loads(raw)
print("serverInfo: ", card.get("serverInfo"))
print("protocolVersion:", card.get("protocolVersion"))
print("transport: ", card.get("transport"))
print("capabilities: ", list(card.get("capabilities", {}).keys()) if isinstance(card.get("capabilities"), dict) else card.get("capabilities"))
if "transport" not in card:
print("WARN: no transport — client cannot connect")
const res = await fetch("https://not.catastrophic.io/.well-known/mcp/server-card.json");
const card = await res.json();
console.log("Mode:", res.headers.get("X-Chaos-Mcp-Mode"));
console.log("Note:", res.headers.get("X-Chaos-Mcp-Note"));
console.log("transport:", card.transport);
if (!card.transport) console.warn("no transport — client cannot connect");
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
resp, _ := http.Get("https://not.catastrophic.io/.well-known/mcp/server-card.json")
defer resp.Body.Close()
raw, _ := io.ReadAll(resp.Body)
var card map[string]any
json.Unmarshal(raw, &card)
fmt.Println("Mode: ", resp.Header.Get("X-Chaos-Mcp-Mode"))
fmt.Println("transport:", card["transport"])
}
fn main() -> Result<(), Box> {
let card: serde_json::Value = reqwest::blocking::get("https://not.catastrophic.io/.well-known/mcp/server-card.json")?.json()?;
println!("transport: {}", card["transport"]);
Ok(())
}
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.http.*;
public class McpServerCard {
public static void main(String[] args) throws Exception {
var client = HttpClient.newHttpClient();
var req = HttpRequest.newBuilder(URI.create("https://not.catastrophic.io/.well-known/mcp/server-card.json")).build();
var resp = client.send(req, HttpResponse.BodyHandlers.ofString());
var card = new ObjectMapper().readTree(resp.body());
System.out.println("Mode: " + resp.headers().firstValue("X-Chaos-Mcp-Mode").orElse(""));
System.out.println("transport: " + card.get("transport"));
}
}
using System.Text.Json;
using var client = new HttpClient();
var resp = await client.GetAsync("https://not.catastrophic.io/.well-known/mcp/server-card.json");
var raw = await resp.Content.ReadAsStringAsync();
using var doc = JsonDocument.Parse(raw);
Console.WriteLine($"Mode: {resp.Headers.GetValues("X-Chaos-Mcp-Mode").First()}");
if (doc.RootElement.TryGetProperty("transport", out var t))
Console.WriteLine($"transport: {t}");
else
Console.WriteLine("no transport — client cannot connect");
require "net/http"
require "json"
resp = Net::HTTP.get_response(URI("https://not.catastrophic.io/.well-known/mcp/server-card.json"))
card = JSON.parse(resp.body)
puts "Mode: #{resp['X-Chaos-Mcp-Mode']}"
puts "transport: #{card['transport'].inspect}"
$resp = Invoke-WebRequest -Uri 'https://not.catastrophic.io/.well-known/mcp/server-card.json' -SkipHttpErrorCheck
$resp.Headers['X-Chaos-Mcp-Mode']
$card = $resp.Content | ConvertFrom-Json
"transport: $($card.transport | ConvertTo-Json -Compress)"
headers
body