Compliant Empty
FreeNot checkedA fully valid MCP server that advertises zero capabilities, demonstrating that protocol conformance does not imply utility.
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
Install Compliant Empty in Claude Desktop, Claude Code & Cursor
unyly install compliant-empty-mcpInstalls 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-mcpFAQ
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
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare 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
