Service MCP
A production-ready generic FastMCP server template with SQLAlchemy async CRUD, enabling rapid bootstrapping of MCP data-management services. It provides registry-driven CRUD, FK resolution, conflict versioning, and multiple transports.
README
Service MCP — Generic FastMCP + SQLAlchemy CRUD Template
A production-ready, generic FastMCP server template with SQLAlchemy async CRUD, built by distilling a real-world fund NAV MCP service into a reusable skeleton. Use it to bootstrap new MCP data-management services.
Stack: Python 3.12+ · FastMCP 3.x · SQLAlchemy 2.x (async) · Pydantic v2 · Typer CLI · uv
Features
- Registry-driven CRUD tools — add/update/delete (single + batch) are generated from a one-line entity registry; no per-entity boilerplate.
- FK code auto-resolution — business codes (
product_code) are resolved to internal IDs by the handler layer; callers never see primary keys. - Auto-placeholder creation — child records referencing a missing parent create a
abnormal=Placeholderstub parent automatically (e.g. price records for an unknown product). - Orphan marking — deleting a parent marks dependent child rows
abnormal=Orphanedinstead of cascade-deleting; areview_abnormal_itemstool aggregates all pending-review rows. - Composite-key delete — child records can be located by their natural compound key
(
product_code + price_date). - Dynamic Filter/Search —
Filter/SearchByKeyword/SearchByFieldsclasses are generated at import time from ORM introspection;.pyistubs are regenerated by a script for IDE support. - Conflict versioning — same-day-same-source price conflicts bump a
versioncolumn and mark the row for human review. - Multi-transport CLI —
stdio/sse/streamable-http/ui(FastMCP Apps dashboard). - Layered config — env vars → TOML → code defaults (
MCP_prefix,MCP_ENVselects the TOML). - Auth-ready — JWT middleware +
mcp_permpermission decorators with permission discovery. - Docker deployment — compose stack (PostgreSQL 18 + Redis 8, optional pgAdmin) with
lifecycle scripts (
ctl.sh/ctl.ps1). - Extras — mock data generator, idempotent migration example, SQLite/MySQL/PostgreSQL/InfluxDB support, FastMCP Apps config UI.
Quick start
uv venv && uv sync --dev
# Run the server (pick one transport)
uv run service-mcp stdio
uv run service-mcp streamable-http --host 0.0.0.0 --port 8001
uv run service-mcp sse --host 0.0.0.0 --port 8001
uv run service-mcp ui --dev-port 8080 --mcp-port 8001
On first start the server auto-creates configs/config.{MCP_ENV}.toml with a default in-memory
SQLite database + Redis cache config — zero configuration to get going.
Example entities
The template ships one minimal domain — Product + ProductPrice — implemented end-to-end to demonstrate every pattern you need to replicate for your own entities:
| Entity | Demonstrates |
|---|---|
Product |
unique business code, soft-delete flag, auto-placeholder creation (orphan parent) |
ProductPrice |
FK code resolution, composite unique key (product_id + price_date + data_source + version), version conflict detection, orphan marking target, composite-key delete |
Follow the chain: add_product → AddHandler → CodeResolveMixin._resolve_fk_codes →
ProductPrice rows auto-resolve product_code → product_id; delete_product marks all its
prices abnormal=Orphaned; add_product_price with a conflicting same-day-same-source value
bumps version and flags abnormal=PriceConflict.
Project structure
service_mcp/
├── server.py # FastMCP app + Typer CLI (stdio/sse/streamable-http/ui)
├── config.py # MCPSettings layered config (env → TOML → code)
├── apps/ # FastMCP Apps UI (config_app: DB/cache management dashboard)
├── auth/ # JWT middleware, mcp_perm decorator, permission/entity discovery
├── db/ # DBManager (async SQLAlchemy CRUD/paginate) + InfluxDBManager
├── handlers/ # CodeResolveMixin + Add/Update/Delete/Query handlers
├── models/
│ ├── orm/ # SQLAlchemy models (base.py audit columns, product.py example)
│ ├── pydantic/ # dynamic Filter/Search generators + per-entity request/response models
│ └── schemas.py # DB/cache config schemas + pagination
├── tools/ # crud_factory (registry-driven), query_tools, basic_tools, dict_tools
└── utils/ # enums, logging, path helpers
configs/ # config.example.toml skeleton (per-env TOMLs are git-ignored)
docker/ # compose files, entrypoint, ctl.sh/ctl.ps1
mock/ # mock_product_data.py
scripts/ # rename_project.py, refresh_project_stub.py, migrate_example.py
tests/ # pytest suite (in-memory SQLite)
Add a new entity
- ORM: create
service_mcp/models/orm/<entity>.pysubclassingBase(audit columns are inherited); add a unique business code column with acomment(used by friendly duplicate messages) and anabnormal: AbnormalType | Nonecolumn for orphan marking. Export it inmodels/orm/__init__.py(importbasefirst). - Pydantic: create
<Entity>Base/Create/Update/Delete(extendsBaseDeleteModel, requires at least one lookup field) /Responseinmodels/pydantic/<entity>.py; reuse the validator helpers inproduct_validators.pyas a template. - Filter/Search: add
create_filter_class(...)/create_search_class(...)calls inmodels/pydantic/filter.py/search.py. If you override the generated class with an explicitclass, re-register it withregister_pyi_class(..., explicit=True). - Regenerate stubs:
uv run python scripts/refresh_project_stub.py(run twice; the second run must produce no diff). - Handlers: add registry rows —
_CODE_RESOLVE_MAP(FK codes),_NAME_RESOLVE_MAP(name fallback),_OWN_CODE_FIELDS(own unique codes),_AUTO_CREATE_MODELS(placeholder auto-creation),_DELETE_NAME_LOOKUP,_COMPOUND_TARGET_REGISTRY(compound delete keys),_ORPHAN_REGISTRY(children to mark on delete),FIELD_MAPPING_CONFIG(FK display fields for query results). - Tools: add a row to
crud_factory._ENTITIES(gives you add/update/delete single+batch tools) and list/search tools inquery_tools.py. - Enums: add
EntityType/AuthResourceentries and any domain enums inutils/enums.py. - Mock/tests: add a TABLE_META row in
mock/mock_product_data.pyand seeded fixtures intests/conftest.py.
Rename the project (one command)
The template uses placeholder naming (service_mcp / service-mcp / "Service MCP"). To create a
new project from this template:
uv run python scripts/rename_project.py my_company \
--project my-company-mcp --display "My Company MCP" --db my_company_data
uv sync # regenerate uv.lock / reinstall
uv run pytest # confirm green
The script rewrites all file contents and renames the package directory. Run with --dry-run to
preview. uv.lock is intentionally skipped — regenerate it with uv sync.
Docker deployment
cp docker/.env.example docker/.env # edit passwords/DB names
./docker/ctl.sh deploy -e prod # or: ctl.ps1 on Windows
Infra only (app runs locally):
cd docker && docker compose up -d
Services: PostgreSQL 18 (5432), Redis 8 (6379), optional pgAdmin (5050).
Configuration reference
| Env var | Meaning | Default |
|---|---|---|
MCP_ENV |
environment name; selects configs/config.{env}.toml |
dev |
MCP_CONFIG_PRIORITY |
init_first / env_first / toml_first / env_only / toml_only |
init_first |
MCP_TRANSPORT |
default transport | stdio |
MCP_HOST / MCP_PORT / MCP_UI_PORT |
HTTP transport bindings | 0.0.0.0 / 8001 / 8080 |
MCP_CACHE_ENABLED |
enable Redis cache | true |
MCP_AUTH_MODE |
tool or admin (JWT) |
tool |
MCP_DATABASES__<NAME>__* |
per-database config (nested __) |
— |
MCP_LOGGING__* |
logging config (console/file/JSON rotation) | — |
Testing & quality
pytest # all tests (in-memory SQLite, no external services)
ruff check . # lint
ruff format . # format
mypy service_mcp # type check
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。