[project]
name = "simplenote-mcp-server"
version = "1.10.0"
description = "A simple MCP Server that connects to Simplenote"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [ "mcp[cli]>=1.10.0", "simplenote>=2.1.4", "requests>=2.32.4", "starlette>=0.49.1", "urllib3>=2.6.3", "aiohttp>=3.9.0",]
[[project.authors]]
name = "Thomas Juul Dyhr"
email = "docdyhr@me.com"
[build-system]
requires = [ "setuptools>=42", "wheel",]
build-backend = "setuptools.build_meta"
[project.license]
text = "MIT"
[project.optional-dependencies]
dev = [ "ruff==0.14.10", "mypy==1.19.1", "pre-commit>=3.0.0", "black>=23.0.0", "bandit[toml]>=1.7.5", "pip-audit>=2.7.3", "radon>=6.0.1", "tomli>=1.2.0;python_version<'3.11'",]
test = [ "pytest>=8.4.2", "pytest-asyncio>=1.2.0", "pytest-cov>=7.0.0", "pytest-mock>=3.15.1", "pytest-timeout>=2.3.1", "requests>=2.32.4", "urllib3>=2.6.3", "tomli>=1.2.0;python_version<'3.11'",]
monitoring = [ "psutil>=5.9.0",]
evals = []
all = [ "ruff==0.14.10", "mypy==1.19.1", "pre-commit>=3.0.0", "black>=23.0.0", "bandit[toml]>=1.7.5", "pip-audit>=2.7.3", "radon>=6.0.1", "pytest>=8.4.2", "pytest-asyncio>=1.2.0", "pytest-cov>=7.0.0", "pytest-mock>=3.15.1", "pytest-timeout>=2.3.1", "psutil>=5.9.0", "requests>=2.32.4", "urllib3>=2.6.3", "tomli>=1.2.0;python_version<'3.11'",]
[project.scripts]
simplenote-mcp-server = "simplenote_mcp.server:run_main"
[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
[[tool.mypy.overrides]]
module = "tests.*"
disallow_untyped_defs = false
[tool.ruff]
target-version = "py310"
line-length = 88
[tool.bandit]
exclude_dirs = [ "tests", "simplenote_mcp/tests", "simplenote_mcp/scripts",]
skips = [ "B101", "B310", "B311", "B404", "B603", "B607",]
severity = "medium"
[tool.ruff.lint]
select = [ "E", "F", "W", "I", "B", "C4", "SIM", "UP",]
ignore = [ "E203", "E501", "E402", "SIM105", "SIM102", "SIM103", "SIM212", "UP035",]
[tool.bandit.assert_used]
skips = [ "*test*.py", "**/tests/**", "**/test_*.py",]
[tool.bandit.blacklist_calls]
bad_name_sets = [ "pickle", "marshal", "shelve", "subprocess_popen", "subprocess_without_shell_equals_true",]
[tool.pytest.ini_options]
minversion = "6.0"
testpaths = [ "tests",]
python_files = [ "test_*.py", "*_test.py",]
python_classes = [ "Test*",]
python_functions = [ "test_*",]
addopts = "--strict-markers --strict-config"
markers = [ "unit: Unit tests - fast, isolated, no external dependencies", "integration: Integration tests - test interactions between components", "perf: Performance tests - slow tests that measure timing/throughput", "security: Security tests - authorization, boundaries, abuse cases", "slow: Slow tests that take significant time to run", "network: Tests that require network access", "auth: Tests that require authentication", "offline: Tests that work in offline mode",]
filterwarnings = [ "ignore::DeprecationWarning", "ignore::PendingDeprecationWarning",]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = [ "F401",]
"tests/*" = [ "S101",]
"simplenote_mcp/tests/*" = [ "S101", "E402",]
"**/conftest.py" = [ "F401",]
"scripts/*" = [ "SIM", "S",]
"simplenote_mcp/scripts/*" = [ "SIM", "S",]
"stubs/*" = [ "ALL",]
"test_workflows_locally.py" = [ "S602",]
[tool.ruff.lint.isort]
known-first-party = [ "simplenote_mcp",]
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.setuptools.packages.find]
where = [ ".",]
include = [ "simplenote_mcp*",]
exclude = [ "tests*", "simplenote_mcp.tests*", "*.tests*",]