Skip to main content
Glama
EduardoDknight

Secure MCP Server Template

Secure MCP Server Template

A minimal, correct, and security-first Model Context Protocol (MCP) server in Python. It exposes three example tools to any MCP client (Claude Desktop, Claude Code, etc.) — each one shipped with the security guard it actually needs.

Most "MCP server" tutorials show you how to expose a tool. They skip the part that matters once a model has real hands on your database, network, and disk. This template is built around that gap: how to give an LLM capabilities without opening a hole.

LLM client ──MCP──> this server ──> [ PostgreSQL | HTTP | filesystem ]
                         │
                         └── every tool passes through guards.py (tested)

What is MCP, in one paragraph

MCP is an open protocol that lets an AI client call external "tools" (functions) and read "resources" through a standard interface. You run a small server that declares tools; the client (Claude Desktop, Claude Code, …) discovers them and the model calls them during a conversation. It's the clean way to give a model access to your data and actions instead of pasting everything into the prompt.

Related MCP server: MySQL MCP Server

Tools

Tool

What it does

Guard

db_query(sql)

Run a read-only SQL query against DATABASE_URL, returns rows as JSON

SELECT/WITH only and a real READ ONLY Postgres session

http_get(url)

HTTP GET, returns the body as text

http/https only + host allowlist, deny-by-default (anti-SSRF)

read_file(path)

Read a text file under MCP_FILES_ROOT

Path resolved inside the root, blocks ../ traversal & absolute paths

Security design (the point of this template)

  • db_query can't write. Two layers: a static check (is_safe_select — rejects writes, DDL, and stacked ; statements) and the connection is opened READ ONLY, so even a clever bypass can't mutate data.

  • http_get can't be turned into an SSRF. Only http(s), and the host must be in MCP_URL_ALLOWLIST. Empty allowlist = nothing allowed (deny-by-default), so a misconfigured server isn't an open proxy.

  • read_file can't escape its root. Paths are resolved and checked to live inside MCP_FILES_ROOT; ../, absolute paths, and symlink escapes raise.

All three guards live in guards.py (zero dependencies) and are covered by tests/test_guards.py, so they run without even installing MCP.

Quickstart

git clone <this repo> && cd mcp-server-template
python -m venv .venv && . .venv/Scripts/activate   # (Linux/mac: . .venv/bin/activate)
pip install -e .            # add: pip install -e ".[db]" for PostgreSQL
cp .env.example .env        # edit with your values
python server.py            # runs over stdio

Use it from Claude Desktop

Add to your claude_desktop_config.json (see claude_desktop_config.example.json):

{
  "mcpServers": {
    "atelier-template": {
      "command": "python",
      "args": ["/absolute/path/to/server.py"],
      "env": { "MCP_URL_ALLOWLIST": "api.github.com", "MCP_FILES_ROOT": "/safe/dir" }
    }
  }
}

Restart Claude Desktop; the three tools appear. (For Claude Code: claude mcp add atelier-template -- python /abs/path/server.py.)

Add your own tool (the 5-line version)

@mcp.tool()
def word_count(text: str) -> str:
    """Count words in a string."""   # <- this docstring is what the model reads
    return str(len(text.split()))

That's the whole loop: decorate a function, write a clear docstring (the model uses it to decide when/how to call), return a string. If the tool touches data/network/disk, add a guard — that's the habit this template is trying to teach.

Layout

server.py     # the MCP server + 3 example tools
guards.py     # pure, dependency-free security helpers (tested)
tests/        # pytest for the guards (run without mcp installed)
.env.example  # configuration

Tests

pip install pytest && pytest -q

License

MIT © 2026 Eduardo Pérez Ignacio

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Servers

  • A
    license
    -
    quality
    C
    maintenance
    Enables secure read-only access to MySQL databases with automatic database inference from project context. Provides safe querying capabilities with built-in security features like parameterized queries, whitelisting, and rate limiting.
    Last updated
    1
    MIT
  • F
    license
    -
    quality
    D
    maintenance
    Enables safe interaction with MySQL databases through SELECT queries, table structure inspection, and database schema exploration. Provides read-only access to query data and examine database metadata.
    Last updated
    1
  • A
    license
    -
    quality
    C
    maintenance
    Provides secure read-only SQL access to PostgreSQL and ClickHouse databases with built-in safety features like read-only enforcement, timeouts, and managed result files.
    Last updated
    MIT

View all related MCP servers

Related MCP Connectors

  • Read-only crypto safety: token honeypot checks, EIP-712 signature decode, approval scans.

  • Read-only access to your VortexIQ store data: audits, KPIs, alerts, Brand DNA, reports, Ask VIQ.

  • Clean web reader for AI agents. Free remote read tier, optional x402 pay-per-call. No API keys.

View all MCP Connectors

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/EduardoDknight/mcp-server-template'

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