Command Palette

Search for a command to run...

UnylyUnyly
Browse all

Compliant Empty

FreeNot checked

A fully valid MCP server that advertises zero capabilities, demonstrating that protocol conformance does not imply utility.

GitHubEmbed

About

A fully valid MCP server that advertises zero capabilities, demonstrating that protocol conformance does not imply utility.

README

An entirely empty MCP server that passes protocol conformance.

This is a rhetorical artifact: a fully-valid Model Context Protocol server that advertises zero tools, zero resources, and zero prompts. It exists to demonstrate that "we have an MCP" is a valueless claim. MCP is a protocol, not a product. A server can be 100% conformant and do absolutely nothing.

Live instance: https://compliant-empty-mcp-production.up.railway.app/mcp

Run it (stdio)

npx -y github:shinytoyrobots/compliant-empty-mcp

Or clone and build:

git clone https://github.com/shinytoyrobots/compliant-empty-mcp
cd compliant-empty-mcp
npm install
npm run build
npm start

The server speaks JSON-RPC 2.0 over stdio. It responds to initialize, tools/list, resources/list, and prompts/list — the last three with empty arrays. Any other method returns JSON-RPC error -32601 ("Method not found").

Run it (HTTP)

npm run start:http

This starts a Streamable HTTP transport on port 3000 (or $PORT). The MCP endpoint is POST /mcp.

curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0.1"}}}'

Test it

Against the live instance

curl -X POST https://compliant-empty-mcp-production.up.railway.app/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

Response: {"result":{"tools":[]},"jsonrpc":"2.0","id":1}

MCP Inspector

npx @modelcontextprotocol/inspector

In the Inspector UI, set Transport Type to "Streamable HTTP", Connection Type to "Direct", and URL to:

https://compliant-empty-mcp-production.up.railway.app/mcp

Connect as an MCP client

Add to ~/.claude.json (Claude Code) or ~/Library/Application Support/Claude/claude_desktop_config.json (Claude Desktop):

{
  "mcpServers": {
    "compliant-empty-mcp": {
      "type": "url",
      "url": "https://compliant-empty-mcp-production.up.railway.app/mcp"
    }
  }
}

The server will appear as a connected MCP with zero tools. That's the point.

Conformance probe (local)

npm run build
npm run conformance
MCP conformance probe — compliant-empty-mcp

  [PASS] AC-2: initialize returns valid InitializeResult with serverInfo.name
  [PASS] AC-3: tools/list returns { tools: [] }
  [PASS] AC-4: resources/list returns { resources: [] }
  [PASS] AC-5: prompts/list returns { prompts: [] }
  [PASS] AC-6: zero tools, zero resources, zero prompts at all times
  [PASS] AC-7: unsupported method returns error -32601
  [PASS] AC-9: stdio transport is the default and functional
  [PASS] AC-1: server terminates cleanly after stdin close

8/8 checks passed.

Deploy your own

The HTTP server runs on any platform that hosts Node.js. A multi-stage Dockerfile is included.

Railway: import from GitHub. Set the custom start command to npm run start:http (under Service → Settings → Deploy).

Render (free tier): connect this repo, set build command npm install && npm run build, start command npm run start:http.

Fly.io: fly launch auto-detects the Dockerfile.

How empty is it?

The full implementation fits in one file:

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  ListToolsRequestSchema,
  ListResourcesRequestSchema,
  ListPromptsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";

const server = new Server(
  { name: "compliant-empty-mcp", version: "0.1.0" },
  { capabilities: { tools: {}, resources: {}, prompts: {} } },
);

server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [] }));
server.setRequestHandler(ListResourcesRequestSchema, async () => ({ resources: [] }));
server.setRequestHandler(ListPromptsRequestSchema, async () => ({ prompts: [] }));

await server.connect(new StdioServerTransport());

That is the entire product. It is a valid MCP server. It does nothing.

The point

Next time a vendor tells you they "have an MCP," ask what's in it.

License

MIT

from github.com/shinytoyrobots/compliant-empty-mcp

Install Compliant Empty in Claude Desktop, Claude Code & Cursor

Recommended · one command, every IDE
unyly install compliant-empty-mcp

Installs into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.

First time? Get the CLI: curl -fsSL https://unyly.org/install | sh

Or configure manually

Run in your terminal:

claude mcp add compliant-empty-mcp -- npx -y github:shinytoyrobots/compliant-empty-mcp

FAQ

Is Compliant Empty MCP free?

Yes, Compliant Empty MCP is free — one-click install via Unyly at no cost.

Does Compliant Empty need an API key?

No, Compliant Empty runs without API keys or environment variables.

Is Compliant Empty hosted or self-hosted?

Self-hosted: the server runs locally on your machine via the install command above.

How do I install Compliant Empty in Claude Desktop, Claude Code or Cursor?

Open Compliant Empty on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.

Related MCPs

Compare Compliant Empty with

Not sure what to pick?

Find your stack in 60 seconds

Author?

Embed badge for your README

Browse similar

All development MCPs