Example MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Example MCP Servercalculate the area of a circle with radius 5"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Server with FastMCP v2.0
A Model Control Protocol (MCP) server implementation using FastMCP v2.0, featuring Docker containerization, comprehensive testing, and CI/CD automation.
Features
π Built with FastMCP v2.0
π³ Docker containerization with multi-stage builds
π¦ Modern Python packaging with
uvπ§ͺ Comprehensive test suite with pytest
π GitHub Actions CI/CD pipeline
π‘οΈ Security scanning and dependency management
π Code coverage reporting
π§ Automated code formatting and linting
Related MCP server: Fast MCP Local
Quick Start
Prerequisites
Python 3.10+
uv for dependency management
Docker (optional, for containerization)
Installation
Clone the repository:
git clone <repository-url>
cd nikolas-mcpInstall dependencies using uv:
uv syncRun the server:
uv run python -m mcp_server.mainUsing Docker
Build the Docker image:
docker build -t mcp-server .Run the container:
docker run -p 8000:8000 mcp-serverOr use docker-compose:
docker-compose upAvailable Tools
The MCP server provides the following tools:
calculate
Evaluates mathematical expressions safely.
Parameters:
expression(string): Mathematical expression to evaluate
Example:
{
"tool": "calculate",
"arguments": {
"expression": "2 + 3 * 4"
}
}greet
Generates friendly greeting messages.
Parameters:
name(string): Name of the person to greet
Example:
{
"tool": "greet",
"arguments": {
"name": "World"
}
}Resources
config://settings- Server configuration settingsinfo://server- General server information
Prompts
help- Display help information about available capabilities
Development
Setup Development Environment
# Install development dependencies
uv sync --dev
# Install pre-commit hooks
uv run pre-commit installRunning Tests
# Run all tests
uv run pytest
# Run tests with coverage
uv run pytest --cov=src --cov-report=html
# Run specific test file
uv run pytest tests/test_main.py -vCode Quality
# Format code
uv run ruff format .
# Lint code
uv run ruff check .
# Type checking
uv run mypy src/Project Structure
nikolas-mcp/
βββ src/
β βββ mcp_server/
β βββ __init__.py
β βββ main.py # Main server implementation
β βββ server.py # Server utilities and config
βββ tests/
β βββ __init__.py
β βββ conftest.py # Pytest configuration
β βββ test_main.py # Main functionality tests
β βββ test_server.py # Server utilities tests
β βββ test_integration.py # Integration tests
βββ .github/
β βββ workflows/
β βββ ci.yml # CI/CD pipeline
β βββ dependabot.yml # Dependabot auto-merge
βββ Dockerfile
βββ docker-compose.yml
βββ pyproject.toml # Project configuration
βββ README.mdCI/CD Pipeline
The project includes a comprehensive GitHub Actions pipeline:
Lint and Format: Runs ruff for code formatting and linting
Test Suite: Runs tests across multiple Python versions and OS platforms
Security Scan: Performs security vulnerability scanning
Docker Build: Builds and tests Docker images
Auto-publish: Publishes to PyPI and Docker Hub on release
Required Secrets
For full CI/CD functionality, configure these GitHub secrets:
PYPI_API_TOKEN- PyPI authentication tokenDOCKERHUB_USERNAME- Docker Hub usernameDOCKERHUB_TOKEN- Docker Hub access token
Configuration
Environment Variables
LOG_LEVEL- Logging level (default: INFO)PYTHONPATH- Python path for module resolution
Server Configuration
The server can be configured via the ServerConfig class in src/mcp_server/server.py:
config = ServerConfig()
config.max_connections = 200
config.timeout = 60Docker Configuration
Multi-stage Build
The Dockerfile uses multi-stage builds for optimized image size:
Base stage: Sets up Python and system dependencies
Dependencies stage: Installs Python packages with uv
Runtime stage: Copies application code and runs the server
Health Checks
The container includes health checks to ensure the server is running correctly.
Contributing
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Make your changes
Run tests and ensure they pass
Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
If you encounter any issues or have questions:
Check the Issues page for existing problems
Create a new issue with detailed information
Refer to the FastMCP documentation for FastMCP-specific questions
Available Tools
2 toolscalculateA
Evaluate a mathematical expression safely.
Args: expression: A mathematical expression to evaluate (e.g., "2 + 2", "10 * 5")
Returns: The result of the calculation as a string
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the key behavioral trait of 'safely' evaluating expressions, which suggests error handling or security considerations. However, it doesn't detail specific safety mechanisms, rate limits, or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: the first sentence states the core purpose, followed by clear sections for Args and Returns. Every sentence adds value without redundancy, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, no annotations, and the presence of an output schema (which covers return values), the description is mostly complete. It explains the purpose, parameter, and return behavior, though it could add more on safety specifics or error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate fully. It adds significant meaning beyond the schema by explaining that 'expression' is a mathematical expression and providing concrete examples ('2 + 2', '10 * 5'), which clarifies the expected format and usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('evaluate') and resource ('mathematical expression'), plus the qualifier 'safely' distinguishes it from generic calculation tools. It explicitly tells what the tool does without restating the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the example expressions provided, but doesn't explicitly state when to use this tool versus alternatives. With only one sibling tool ('greet') that's unrelated, there's no need for sibling differentiation, but no explicit guidance on context or exclusions is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
greetB
Generate a friendly greeting message.
Args: name: The name of the person to greet
Returns: A personalized greeting message
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool generates a greeting and returns a message, but doesn't describe any behavioral traits such as rate limits, error handling, or side effects. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: it starts with the core purpose in the first sentence, followed by clear sections for arguments and returns. Every sentence earns its place without waste, making it efficient and well-structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one parameter, simple output) and the presence of an output schema (which handles return values), the description is complete enough. It covers the purpose, parameter meaning, and return type, though it lacks behavioral details. For a straightforward greeting tool, this is largely sufficient, but minor gaps prevent a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, but the description compensates by explaining the parameter 'name' as 'The name of the person to greet.' This adds meaning beyond the schema, which only specifies the type. However, with only one parameter and no complex details, the description provides adequate but minimal semantic context, aligning with the baseline for this simple case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Generate a friendly greeting message.' It specifies the verb ('generate') and resource ('greeting message'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from its sibling tool 'calculate', which is a different function, so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any context, prerequisites, or exclusions for usage. The only implied usage is for generating greetings, but this is basic and lacks explicit when/when-not instructions or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The two tools have completely distinct purposes: 'calculate' handles mathematical expressions, while 'greet' generates personalized greetings. There is no overlap in functionality, making it impossible to confuse them.
Both tool names follow a simple verb-only pattern ('calculate', 'greet'), which is consistent and predictable. There are no mixed conventions or deviations in naming style.
With only 2 tools, the server feels thin and under-scoped for a general-purpose 'Example MCP Server'. This minimal set lacks the depth needed to handle a coherent domain or typical workflows effectively.
The server's purpose is unclear from the tools provided, but the surface is severely incomplete for any meaningful domain. There are obvious gaps, such as missing related operations (e.g., no other utilities or extended functionality), which will limit agent capabilities.
Maintenance
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
This MCP server enables users to perform scientific computations regarding linear algebra and vectβ¦
A simple MCP server built with FastMCP and python
A MCP server built for developers enabling Git based project management with project and personalβ¦
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA simple MCP server that provides basic calculator functionality for performing mathematical operations. Built with FastMCP and demonstrates fundamental MCP server implementation patterns.
- AlicenseNot gradedqualityDmaintenanceA minimal FastMCP server implementation that provides basic mathematical and greeting tools. Enables users to perform simple operations like adding numbers and greeting people by name through a lightweight MCP interface.MIT
- FlicenseNot gradedqualityDmaintenanceA basic MCP server example that provides simple arithmetic tools (addition and subtraction) and personalized greeting resources. Serves as a foundation for learning MCP server implementation and development.
- FlicenseNot gradedqualityDmaintenanceA simple educational MCP server providing basic math operations, string manipulation, and greeting functionality. Demonstrates how to implement MCP tools for learning purposes.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/nykznykz/mcp_example'
If you have feedback or need assistance with the MCP directory API, please join our Discord server