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