online / endpoints 59 / categories 14 / rate 60/min/ip /

GET /.well-known/mcp/server-card.json

GET /.well-known/mcp/server-card.json

Parametric chaos for the SEP-1649 MCP Server Card — the well-known document AI agents check to learn what tools, prompts, and resources an MCP server claims to offer. Default mode is a card with capabilities but no transport field; other modes cover protocol-version mismatch, dead transport URLs, and schema-invalid documents.

mode missing-transport (default; capabilities declared but no transport field — clients have no way to connect to the server they just discovered), version-mismatch (protocolVersion claims 2024-11-05 but capabilities include elicitation, introduced in 2025-06-18), transport-404 (transport.endpoint references nonexistent.invalid per RFC 6761; connect attempts hang), invalid-schema (several fields have the wrong type plus extra unknown top-level fields; schema-validating clients reject, permissive ones coerce or ignore).

control Compare against the well-formed counterpart: not.catastrophic.io/.well-known/mcp/server-card.json side-by-side

build a request:

expect: 200 OK with Content-Type: application/json. X-Chaos-Mcp-Mode reflects the selected mode; X-Chaos-Mcp-Note explains the flaw in plain text.

bash
curl -i 'https://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport'
import urllib.request, json
raw = urllib.request.urlopen("https://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport").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://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport");
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://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport")
    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://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport")?.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://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport")).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://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport");
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://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport"))
card = JSON.parse(resp.body)
puts "Mode: #{resp['X-Chaos-Mcp-Mode']}"
puts "transport: #{card['transport'].inspect}"
$resp = Invoke-WebRequest -Uri 'https://chaos.catastrophic.io/.well-known/mcp/server-card.json?mode=missing-transport' -SkipHttpErrorCheck
$resp.Headers['X-Chaos-Mcp-Mode']
$card = $resp.Content | ConvertFrom-Json
"transport: $($card.transport | ConvertTo-Json -Compress)"

Spec status (2026-05-17): SEP-1649 is still being standardised in modelcontextprotocol/modelcontextprotocol#2127. These modes target the stable core shape (serverInfo, protocolVersion, transport, capabilities); when the spec freezes some modes may need follow-up alignment.