File size: 3,645 Bytes
77d4a9a
 
 
98262e8
77d4a9a
4e94652
8a9c2ff
51ea945
 
061c53c
51ea945
4e94652
98262e8
7cabd61
aa46c09
d1d50db
8c5bdf2
4e94652
77d4a9a
 
b593d5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77d4a9a
b8df5e6
 
51ea945
 
 
 
 
4e4e683
17763eb
95e8d10
9adbb54
670f900
77d4a9a
 
39a5900
acef890
b23a78c
904d4e5
39a5900
169c713
78fb1f7
4e4e683
77d4a9a
76b8ceb
 
 
 
b593d5c
 
 
 
 
3949bae
 
 
bef29e0
76b8ceb
bef29e0
77d4a9a
76b8ceb
 
 
c845368
 
 
76b8ceb
 
 
 
 
 
51c9311
77d4a9a
 
4d77d45
8414d7b
a853a78
58bd353
acef890
 
 
 
7fa3a9d
acef890
b6e3626
 
494d787
b6e3626
 
 
 
 
 
 
ad0696c
670f900
3dafe0d
ad0696c
670f900
 
 
 
 
 
 
 
 
 
 
 
 
 
62256a2
 
76b8ceb
62256a2
 
 
b031366
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
[project]
name = "fastmcp"
dynamic = ["version"]
description = "The fast, Pythonic way to build MCP servers and clients."
authors = [{ name = "Jeremiah Lowin" }]
dependencies = [
    "python-dotenv>=1.1.0",
    "exceptiongroup>=1.2.2",
    "httpx>=0.28.1",
    "mcp>=1.12.4,<2.0.0",
    "openapi-pydantic>=0.5.1",
    "rich>=13.9.4",
    "cyclopts>=3.0.0",
    "authlib>=1.5.2",
    "pydantic[email]>=2.11.7",
    "pyperclip>=1.9.0",
    "openapi-core>=0.19.5",
]
requires-python = ">=3.10"
readme = "README.md"
license = "Apache-2.0"

keywords = [
    "mcp",
    "mcp server",
    "mcp client",
    "model context protocol",
    "fastmcp",
    "llm",
    "agent",
]
classifiers = [
    "Intended Audience :: Developers",
    "License :: OSI Approved :: Apache Software License",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Typing :: Typed",
]

[dependency-groups]
dev = [
    "copychat>=0.5.2",
    "dirty-equals>=0.9.0",
    "fastapi>=0.115.12",
    "ipython>=8.12.3",
    "pdbpp>=0.10.3",
    "pre-commit",
    "psutil",
    "pyinstrument>=5.0.2",
    "pyperclip>=1.9.0",
    "ty>=0.0.1a19",
    "pytest>=8.3.3",
    "pytest-asyncio>=0.23.5",
    "pytest-cov>=6.1.1",
    "pytest-env>=1.1.5",
    "pytest-flakefinder",
    "pytest-httpx>=0.35.0",
    "pytest-report>=0.2.1",
    "pytest-timeout>=2.4.0",
    "pytest-xdist>=3.6.1",
    "ruff",
]

[project.scripts]
fastmcp = "fastmcp.cli:app"

[project.urls]
Homepage = "https://gofastmcp.com"
Repository = "https://github.com/jlowin/fastmcp"
Documentation = "https://gofastmcp.com"

[project.optional-dependencies]
websockets = ["websockets>=15.0.1"]

[build-system]
requires = ["hatchling", "uv-dynamic-versioning>=0.7.0"]
build-backend = "hatchling.build"

[tool.hatch.version]
source = "uv-dynamic-versioning"

[tool.hatch.metadata]
allow-direct-references = true

[tool.uv-dynamic-versioning]
vcs = "git"
style = "pep440"
bump = true
fallback-version = "0.0.0"


[tool.pytest.ini_options]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "session"
asyncio_default_test_loop_scope = "session"
# filterwarnings = ["error::DeprecationWarning"]
timeout = 3
env = [
    "FASTMCP_TEST_MODE=1",
    'D:FASTMCP_LOG_LEVEL=DEBUG',
    'D:FASTMCP_ENABLE_RICH_TRACEBACKS=0',

]
markers = [
    "integration: marks tests as integration tests (deselect with '-m \"not integration\"')",
    "client_process: marks tests that spawn client processes via stdio transport. These can create issues when run in the same CI environment as other subprocess-based tests.",
]
# Automatically mark all tests in integration_tests folder
pythonpath = ["."]
testpaths = ["tests"]
python_files = ["test_*.py", "*_test.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]

[tool.ty.src]
include = ["src", "tests"]
exclude = ["**/node_modules", "**/__pycache__", ".venv", ".git", "dist"]

[tool.ty.environment]
python-version = "3.10"

[tool.ty.rules]
# Rules with too many errors to fix right now (40+ each)
invalid-argument-type = "ignore" # 40 errors
no-matching-overload = "ignore"  # 126 errors  
unknown-argument = "ignore"      # 61 errors
unresolved-attribute = "ignore"  # 60 errors

# Rules with moderate errors that need more investigation
call-non-callable = "ignore" # 7 errors
missing-argument = "ignore"  # 23 errors

[tool.ruff.lint]
extend-select = ["I", "UP"]

[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401", "I001", "RUF013"]
# allow imports not at the top of the file
"src/fastmcp/__init__.py" = ["E402"]