mcp-quickserver
A working MCP server template for notes management (add, get, search, delete) with in-memory store, demonstrating tools, resources, and prompts for easy forking and customization.
README
mcp-quickserver
A working MCP (Model Context Protocol) server template. Fork it, swap the store, add your tools.
Demonstrates all three MCP primitives — tools, resources, and prompts — with both stdio and SSE transports, proper error handling, and a test harness that runs without a connected client.
What's included
| Primitive | What it does |
|---|---|
| Tools | add_note, get_note, search_notes, delete_note |
| Resources | notes://all (full list), notes://{id} (single note) |
| Prompts | summarize_notes — builds a summarisation prompt, optionally filtered by tag |
The backing store is an in-memory NoteStore. Replacing it with SQLite, Postgres, or Redis is a one-file change.
Install
pip install -e .
Requires Python ≥ 3.10 and the mcp SDK.
Wire to Claude Desktop
Copy claude_desktop_config.json.example into your Claude Desktop config:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"quickserver": {
"command": "python",
"args": ["-m", "mcpquickserver"],
"cwd": "/absolute/path/to/mcp-quickserver"
}
}
}
Restart Claude Desktop. The tools appear automatically in the tool picker.
Wire to Claude Code
# From within your project
claude mcp add quickserver -- python -m mcpquickserver
Or add to .claude/settings.json:
{
"mcpServers": {
"quickserver": {
"command": "python",
"args": ["-m", "mcpquickserver"]
}
}
}
Run as an HTTP server (SSE transport)
MCP_HOST=0.0.0.0 MCP_PORT=9000 python -m mcpquickserver --transport sse
SSE transport is useful when the client runs in a different process or on a different machine.
Code layout
src/mcpquickserver/
├── server.py ← tool/resource/prompt registration against a NoteStore
├── store.py ← NoteStore business logic (swap this for persistence)
└── __main__.py ← CLI entry point
Adding a tool
# server.py
@mcp.tool()
def word_count(text: str) -> str:
"""Count the words in a block of text."""
return str(len(text.split()))
FastMCP generates the JSON schema from the type annotations. The docstring becomes the tool description shown to the model.
Adding a resource
@mcp.resource("config://settings")
def settings_resource() -> str:
"""Current server configuration as JSON."""
return json.dumps({"version": "0.1.0", "store": "memory"})
Dynamic URI segments work too — notes://{note_id} captures note_id from the URI and passes it as a parameter.
Adding a prompt template
@mcp.prompt()
def draft_email(recipient: str, topic: str) -> str:
"""Build a prompt to draft a professional email."""
return f"Please draft a professional email to {recipient} about: {topic}"
Error handling
Tools that raise an exception return an is_error: true result to the model so it can recover — the exception does not propagate to the caller or crash the server:
@mcp.tool()
def get_note(note_id: str) -> str:
"""Retrieve a note by its ID."""
note = store.get(note_id)
if note is None:
raise ValueError(f"No note with id {note_id!r}") # → is_error result
return json.dumps(note, indent=2)
Tests
pip install -e ".[dev]"
pytest -v
Tests cover the NoteStore business logic and all tool/resource/prompt handlers directly. No connected client required. The store module attribute is monkeypatched per test so each test starts with a clean slate.
Replacing the store
NoteStore in store.py exposes five methods: add, get, delete, search, all. Any object that implements those five is a drop-in replacement:
# e.g. SQLite backend
class SqliteNoteStore:
def __init__(self, db_path: str): ...
def add(self, title, content, tags=None) -> str: ...
def get(self, note_id) -> dict | None: ...
def delete(self, note_id) -> bool: ...
def search(self, query="", tag="") -> list[dict]: ...
def all(self) -> list[dict]: ...
Swap the store = NoteStore() line in server.py and the rest is unchanged.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.