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)
Metadata
Release files for fastmcp-lint 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fastmcp_lint-0.1.2.tar.gz | 6.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastmcp_lint-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.2 kB
Release files / fastmcp_lint-0.1.2.tar.gz
| Download URL | fastmcp_lint-0.1.2.tar.gz |
|---|---|
| Size | 6.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
34c0c5e979efd646a11b156c8ebb408479545deacdfd29baf6f6a3bbe95678c1
|
|
BLAKE2b-256 checksum How to use checksums |
64aaf9ef719cd56d8ff7d9024acb2c48bcc29069045fa17c4b2ae8c9cb707fd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|
Release files / fastmcp_lint-0.1.2-py3-none-any.whl
| Download URL | fastmcp_lint-0.1.2-py3-none-any.whl |
|---|---|
| Size | 8.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0136f107181715846c08e922b77cc76e0fdc9e26a49470fcb4c553a2671d2bed
|
|
BLAKE2b-256 checksum How to use checksums |
09391d686ecd5d1be002200a96bf9c9c2ea556dddaa57ba10de143d06ed528ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|