Skip to main content
Glama
ilil1

Simple MCP Server

by ilil1

Simple MCP Server

A minimal implementation of the Model Context Protocol (MCP) server using FastMCP. This example demonstrates how to create a simple MCP server that clients like Windsurf IDE and Claude can connect to.

What is MCP?

The Model Context Protocol (MCP) is a standard that connects LLMs with external tools and data sources. MCP servers extend AI capabilities by providing access to specialized tools, external information, and services.

Related MCP server: MCP Server Demo

Features

  • Dual transport support (HTTP and stdio)

  • Simple authentication middleware for HTTP transport

  • Example tools implementation

  • Compatible with MCP clients like Windsurf IDE and Claude

Prerequisites

Installation

  1. Clone this repository:

    git clone https://github.com/rjmoggach/simple-mcp-server.git
    cd simple-mcp-server
  2. Install dependencies:

    uv sync

Usage

You can run the server in three different modes:

Run with both transports (default)

python run_server.py

This will start the HTTP server on port 9876 and the stdio server simultaneously.

HTTP transport only

python run_server.py --http-only

stdio transport only

python run_server.py --stdio-only

Available Tools

The server provides these example tools:

  1. hello_world - A simple greeting tool

    • Parameters:

      • name (string, default: "World"): Name to greet

      • delay (integer, default: 0): Optional delay in seconds

    • Returns: A greeting message

  2. get_version - Returns server version information

    • Returns: Version details including server name and API version

  3. system_info - Returns basic system information

    • Returns: Python version and platform details

Connecting to AI Systems

Windsurf IDE Configuration

Add the following configuration to your Windsurf IDE settings:

"simple-mcp": {
  "command": "npx",
  "args": [
    "mcp-remote", 
    "http://localhost:9876/", 
    "--allow-http", 
    "--header", 
    "Authorization: Bearer SIMPLE_MCP_SERVER"
  ]
}

Claude Desktop Configuration

Add the following to your Claude Desktop configuration:

{
  "mcpServers": {
    "simple-mcp": {
      "command": "uv",
      "args": [
        "run", 
        "--project", "/path/to/simple-mcp-server", 
        "python", "/path/to/simple-mcp-server/run_server.py", 
        "--stdio-only"
      ],
      "cwd": "/path/to/simple-mcp-server"
    }
  }
}

Replace /path/to/simple-mcp-server with the actual path to your project.

Authentication

For HTTP transport, the server uses a simple token-based authentication:

  • Token: SIMPLE_MCP_SERVER (defined in run_server.py)

  • Header format: Authorization: Bearer SIMPLE_MCP_SERVER

Extending the Server

To add your own tools, modify the create_mcp_server() function in run_server.py:

@mcp.tool()
async def your_custom_tool(param1: str, param2: int = 0) -> dict:
    """Your custom tool description."""
    # Implementation here
    return {"result": "Your output"}

License

MIT License

Available Tools

3 tools
get_versionB

Get server version information.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but only states what the tool does without disclosing behavioral traits. It doesn't mention whether this is a read-only operation, if it requires authentication, rate limits, or what format the version information returns, leaving significant gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with zero wasted words. It's front-loaded with the core purpose and appropriately sized for a simple tool with no parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations, no output schema, and behavioral unknowns, the description is incomplete. It doesn't address what the return value looks like, potential errors, or operational context, leaving the agent with insufficient information for confident use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, and schema description coverage is 100%, so no parameter documentation is needed. The description appropriately doesn't discuss parameters, earning a high baseline score for not adding unnecessary information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and resource ('server version information'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'system_info' which might also provide version-related data, preventing a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like 'system_info' or 'hello_world'. The description offers no context about appropriate use cases or exclusions, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hello_worldC

A simple hello world tool that returns a greeting.

    Args:
        name: Name to greet
        delay: Optional delay in seconds

    Returns:
        A greeting message
    
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoWorld
delayNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It mentions the tool returns a greeting and has an optional delay, but lacks details on behavioral traits such as whether it's read-only, if it has side effects, rate limits, or error handling. The description doesn't contradict annotations (none exist), but it's insufficient for a tool with parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized with a brief overview and structured parameter/return sections. It's front-loaded with the purpose, but the formatting with indentation and bullet-like points could be more streamlined for clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (2 parameters, no output schema, no annotations), the description is somewhat complete but has gaps. It explains parameters and returns, but lacks behavioral context and usage guidelines. For a simple tool, it's adequate but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining that 'name' is for greeting and 'delay' is an optional delay in seconds, which clarifies beyond the schema's basic titles. However, it doesn't cover defaults (e.g., name defaults to 'World') or constraints, leaving some gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool returns a greeting, which is a clear purpose, but it's vague about what 'hello world' entails beyond that. It doesn't distinguish from siblings like get_version or system_info, which might also return simple outputs. The phrase 'simple hello world tool' is somewhat tautological with the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like get_version or system_info. The description implies it's for greetings, but there's no explicit context for when it's appropriate or any exclusions mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_infoB

Get basic system information.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool 'Get[s]' information, implying a read-only operation, but doesn't specify if it requires permissions, has rate limits, returns real-time vs. cached data, or what format the output takes. For a tool with zero annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence ('Get basic system information.') that is front-loaded and wastes no words. It directly communicates the core purpose without unnecessary elaboration, making it highly concise and well-structured for its simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (0 parameters, no output schema, no annotations), the description is minimally complete. It states what the tool does but lacks details on behavioral traits, output format, or usage context. This is adequate for a basic tool but leaves gaps that could hinder an agent's understanding in more complex scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0 parameters with 100% description coverage, so no parameter documentation is needed. The description doesn't add parameter details beyond the schema, which is appropriate here. A baseline of 4 is applied as it adequately handles the lack of parameters without introducing confusion.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get basic system information' clearly states the verb ('Get') and resource ('basic system information'), making the purpose immediately understandable. It distinguishes from siblings like 'get_version' (which likely returns version-specific data) and 'hello_world' (a test endpoint) by focusing on general system details. However, it doesn't specify what 'basic' entails (e.g., OS, memory, CPU), keeping it from a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like 'get_version'. The description implies it's for retrieving system information but doesn't clarify if 'get_version' is a subset or a different type of data, nor does it mention any prerequisites or exclusions. This leaves the agent without explicit usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 3 tool updates
    • First observedget_version
    • First observedhello_world
    • First observedsystem_info

TDQS

B3.1/5.0
Disambiguation5/5

All three tools have clearly distinct purposes with no overlap: get_version retrieves server metadata, hello_world provides a customizable greeting function, and system_info returns hardware/OS information. An agent could easily distinguish between these different domains.

Naming Consistency4/5

Two tools follow a consistent verb_noun pattern (get_version, system_info), while hello_world uses a different convention. The deviation is minor since all names remain clear and readable, but the pattern isn't fully uniform.

Tool Count3/5

With only three tools, this feels somewhat thin for a general-purpose server. While each tool serves a distinct function, the set lacks depth and could benefit from additional utilities to form a more complete toolkit.

Completeness2/5

The server's purpose appears to be general system/server utilities, but there are significant gaps: no file operations, no network utilities, no process management, and no configuration tools. The three existing tools provide only basic informational functions without supporting common workflows.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A minimal Model Context Protocol server demo that exposes tools through HTTP API, including greeting, weather lookup, and HTTP request capabilities. Demonstrates MCP server implementation with stdio communication and HTTP gateway functionality.
    10
    ISC
  • A
    license
    Not graded
    quality
    D
    maintenance
    A minimal tool server demonstrating Model Context Protocol (MCP) interactions via local CLI and WebSocket transports. It provides tools for simple greeting responses and making external HTTP API calls using a configurable base URL.
    225
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A minimal learning-focused MCP server that demonstrates core primitives like tools and resources through simple greeting functions. It provides a foundational example for connecting AI models to external data using both Streamable HTTP and stdio transports.
    17
    MIT

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/ilil1/simple-mcp-server'

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