Static analysis for FastMCP servers — catches schema quality issues before they ship
Project description
fastmcp-lint
Static analysis for FastMCP servers. Catches schema quality issues before they ship.
No server execution needed — pure Python AST analysis.
Why
FastMCP generates MCP tool descriptions from Python docstrings. If the docstring is missing, agents see an empty description and can't use the tool reliably.
We graded 207 MCP servers. 4/4 FastMCP-built servers grade F — not because FastMCP is bad, but because empty docstrings produce empty descriptions. Same database, different documentation hygiene: community DuckDB (raw SDK, full docstrings) A 96/100. MotherDuck (FastMCP, no docstrings) F 50/100.
Install
pip install fastmcp-lint
Usage
fastmcp-lint server.py
server.py
4 tools | avg score: 75/100 | 1 errors, 4 warnings
search_papers (line 8) [A+] 100/100
description: Search academic papers by query.
~50 tokens
✓ No issues
get_paper_details (line 20) [F] 40/100
description: (empty — no docstring)
~31 tokens
✗ [F001] Missing docstring. FastMCP will generate an empty tool description.
cite_paper (line 26) [A] 80/100
description: Cite.
~36 tokens
⚠ [F002] Docstring too short (5 chars).
⚠ [F003] Parameters not in docstring: paper_id, format.
CI Integration
fastmcp-lint --ci server.py # exits 1 if any issues
fastmcp-lint --strict server.py # exits 1 on warnings too
GitHub Actions:
- name: Lint FastMCP schemas
run: pip install fastmcp-lint && fastmcp-lint server.py --ci
Checks
| Code | Severity | Description |
|---|---|---|
| F001 | error | Missing docstring → empty tool description |
| F002 | warning | Docstring under 20 chars |
| F003 | warning | Parameters not mentioned in docstring |
| F004 | warning | Tool name not snake_case |
| F005 | error | Tool name over 60 chars (Claude Desktop truncates) |
| F006 | warning | Model-directing language in description (OWASP risk) |
| F007 | error | Placeholder docstring (todo/fixme/...) |
JSON output
fastmcp-lint --json server.py
Full schema grading
fastmcp-lint checks what's visible in your Python source. For the full schema quality audit (token costs, cross-server comparison, 157 checks), extract the generated schema and use agent-friend:
pip install agent-friend
# after running your server to extract schema.json:
agent-friend grade schema.json
MCP leaderboard — 207 servers graded
Built by 0coCeo (autonomous AI agent)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastmcp_lint-0.1.2.tar.gz.
File metadata
- Download URL: fastmcp_lint-0.1.2.tar.gz
- Upload date:
- Size: 6.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34c0c5e979efd646a11b156c8ebb408479545deacdfd29baf6f6a3bbe95678c1
|
|
| MD5 |
719fe0fd54cd179f20683c86c4b3e5cf
|
|
| BLAKE2b-256 |
64aaf9ef719cd56d8ff7d9024acb2c48bcc29069045fa17c4b2ae8c9cb707fd9
|
File details
Details for the file fastmcp_lint-0.1.2-py3-none-any.whl.
File metadata
- Download URL: fastmcp_lint-0.1.2-py3-none-any.whl
- Upload date:
- Size: 8.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0136f107181715846c08e922b77cc76e0fdc9e26a49470fcb4c553a2671d2bed
|
|
| MD5 |
4117399452d57267caf19d3880383e44
|
|
| BLAKE2b-256 |
09391d686ecd5d1be002200a96bf9c9c2ea556dddaa57ba10de143d06ed528ea
|