Skip to main content
Glama
jiawang1

MCP Demo Server

by jiawang1

MCP Demo Server

A stateless HTTP Streaming server built with Model Context Protocol (MCP) and Express.

🌐 Live Demo

Production URL: https://mcp-demo-d3cj.onrender.com/mcp

Try it now:

curl -X POST https://mcp-demo-d3cj.onrender.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

πŸ“š Documentation

Features

  • βœ… Fully Stateless - Each request is processed independently

  • βœ… HTTP Streaming - Standard HTTP POST-based streaming transport

  • βœ… Easy to Scale - No session management, horizontally scalable

  • βœ… Simple Deployment - Perfect for serverless environments (Lambda, Cloud Functions)

  • βœ… Production Ready - Live at https://mcp-demo-d3cj.onrender.com

  • βœ… Two built-in tools:

    • read_widget_resource: Read widgetResource.md file

    • read_page_resource: Read pageResource.md file

Installation

npm install

Running Locally

# Production mode
npm start

# Development mode (with hot reload)
npm run dev

# Test with MCP Inspector
npm run test

Server runs on http://localhost:3000 by default.

Testing and Debugging

Using Production Server

Test the live production server:

# List available tools
curl -X POST https://mcp-demo-d3cj.onrender.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

# Call read_widget_resource tool
curl -X POST https://mcp-demo-d3cj.onrender.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"read_widget_resource","arguments":{}}}'
# First start the server
npm start

# In another terminal, run the test client
npm run test-streaming

The test client will:

  1. List all available tools

  2. Call read_widget_resource tool

  3. Call read_page_resource tool

Using curl for Local Testing

# List available tools
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":"tools/list","params":{}}'

# Call read_widget_resource tool
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"read_widget_resource","arguments":{}}}'

# Check server health
curl http://localhost:3000/health

# Get server information
curl http://localhost:3000/

API Endpoints

HTTP Streaming Transport

1. MCP Endpoint

  • Path: /mcp

  • Method: POST

  • Description: HTTP streaming endpoint for MCP JSON-RPC requests

  • Features: Fully stateless, each request is processed independently

Other Endpoints

2. Health Check

  • Path: /health

  • Method: GET

  • Description: Check server status

3. Root Path

  • Path: /

  • Method: GET

  • Description: Get server information and available tools list

Available Tools

read_widget_resource

Reads the content of src/resources/widgetResource.md file.

Input: No parameters required

Output: File content as text

Example:

# Local
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":"tools/call","params":{"name":"read_widget_resource","arguments":{}}}'

# Production
curl -X POST https://mcp-demo-d3cj.onrender.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"read_widget_resource","arguments":{}}}'

read_page_resource

Reads the content of src/resources/pageResource.md file.

Input: No parameters required

Output: File content as text

Example:

# Local
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"read_page_resource","arguments":{}}}'

# Production
curl -X POST https://mcp-demo-d3cj.onrender.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"read_page_resource","arguments":{}}}'

Usage Examples

Check Server Health

# Local
curl http://localhost:3000/health

# Production
curl https://mcp-demo-d3cj.onrender.com/health

Get Server Information

# Local
curl http://localhost:3000/

# Production
curl https://mcp-demo-d3cj.onrender.com/

MCP Client Integration

To connect to this MCP server, your MCP client needs to:

  1. Send HTTP POST requests to the /mcp endpoint

  2. Use JSON-RPC 2.0 format

  3. Include proper Accept headers: application/json, text/event-stream

  4. Receive results through HTTP response

Configuration Examples

Local Development

{
  "mcpServers": {
    "mcp-demo-local": {
      "transport": {
        "type": "http",
        "url": "http://localhost:3000/mcp"
      }
    }
  }
}

Production

{
  "mcpServers": {
    "mcp-demo": {
      "transport": {
        "type": "http",
        "url": "https://mcp-demo-d3cj.onrender.com/mcp"
      }
    }
  }
}

Using MCP SDK

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';

const client = new Client({
  name: 'my-client',
  version: '1.0.0',
});

// Use production server
const transport = new StreamableHTTPClientTransport(
  new URL('https://mcp-demo-d3cj.onrender.com/mcp')
);

// Or use local server
// const transport = new StreamableHTTPClientTransport(
//   new URL('http://localhost:3000/mcp')
// );

await client.connect(transport);

// List tools
const tools = await client.listTools();

// Call tool
const result = await client.callTool({
  name: 'read_widget_resource',
  arguments: {},
});

Tech Stack

  • @modelcontextprotocol/sdk: MCP protocol implementation

  • Express: Web framework

  • CORS: Cross-Origin Resource Sharing support

  • Node.js: ES Modules

Project Structure

mcp-demo/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ index.js                 # Main server file
β”‚   └── resources/
β”‚       β”œβ”€β”€ widgetResource.md    # Widget resource file
β”‚       └── pageResource.md      # Page resource file
β”œβ”€β”€ test-http-streaming.js       # HTTP Streaming test client
β”œβ”€β”€ package.json
β”œβ”€β”€ README.md
└── LICENSE

Environment Variables

  • PORT: Server port (default: 3000)

PORT=8080 npm start

Development

The server uses ES Modules and requires Node.js 14.0 or higher.

In development mode, use the --watch flag for automatic restarts:

npm run dev

Deployment

This server is deployed on Render and available at: https://mcp-demo-d3cj.onrender.com/mcp

You can deploy your own instance:

  1. Fork this repository

  2. Connect to Render/Vercel/Railway

  3. Set environment variables if needed

  4. Deploy!

License

MIT

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jiawang1/mcp-demo'

If you have feedback or need assistance with the MCP directory API, please join our Discord server