[project] name = "tbank-mcp" version = "0.2.2" description = "MCP server for the T-Bank (Т-Банк) mobile personal-banking API (capture-driven, headless, pinned-root TLS)." readme = "README.md" requires-python = ">=3.11" license = "MIT" license-files = ["LICENSE"] authors = [{ name = "icyberdeveloper" }] keywords = [ "mcp", "mcp-server", "model-context-protocol", "tbank", "t-bank", "tinkoff", "banking", "fintech", "claude", "ai-agents", "llm", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Office/Business :: Financial", ] dependencies = [ # <2 is load-bearing, not caution: mcp 2.0.0 dropped `mcp.server.fastmcp`, and # server.py's first import is `from mcp.server.fastmcp import FastMCP`. A bare # `mcp>=1.2` resolves to 2.0.0 on a fresh install and dies with ModuleNotFoundError # before anything runs. Lifting the ceiling means porting server.py to the 2.0 API. "mcp>=1.2,<2", "requests>=2.32", "playwright>=1.40", # server.py imports pydantic directly (BaseModel for elicitation schemas, # create_model for the pay-bill form). It arrives transitively through mcp # today, but a direct runtime import must be a direct dependency — a change in # mcp's own deps would otherwise break the import with no version signal. "pydantic>=2", ] [project.urls] Homepage = "https://github.com/icyberdeveloper/tbank-mcp" Repository = "https://github.com/icyberdeveloper/tbank-mcp" Issues = "https://github.com/icyberdeveloper/tbank-mcp/issues" [project.scripts] tbank-mcp = "tbank_mcp.server:main" # The password/PIN never travel through the agent — first login happens in the # user's own terminal. A pip install must therefore ship the login CLI too, or # the server is unusable on a fresh device. tbank-mcp-login = "tbank_mcp.login_cli:main" # Copies the shipped skills into ~/.claude/skills and removes stale copies under # retired names — the README's old manual rm+cp loop, packaged. tbank-mcp-skills = "tbank_mcp.skills_cli:main" [build-system] # setuptools>=77.0.3 is the first release that accepts the PEP 639 SPDX # `license` string + `license-files` used above. requires = ["setuptools>=77.0.3"] build-backend = "setuptools.build_meta" [tool.setuptools] packages = ["tbank_mcp"] [tool.setuptools.package-data] # ca/roots and docs are runtime DATA living INSIDE the package so that tls.py's # ROOTS_DIR (/ca/roots) and server.py's _FLOWS_PATH (/docs/FLOWS.md) # resolve identically in an editable checkout and in a wheel install. A wheel # without them fails certificate verification on every bank host (misdiagnosed # as "the connection is being intercepted") and flows() answers "not found" — # tests/test_tls_trust.py builds a wheel and asserts both files are in it. # Skills ship as SKILL.md only — evals/ are dev fixtures, not user content. tbank_mcp = ["ca/roots/*.pem", "docs/*.md", "skills/*/SKILL.md"]