Files
alvaro 96895996d9 feat(mcp): connect authenticated AquaPortal tools to Vocero (#1)
Vocero needs to query AquaPortal on behalf of the caller selected by the existing phone link. This adds server-owned conversations and MCP tool execution for voice and HTTP reasoning while leaving the speech pipeline unchanged.

Release notes:

- Added browser-bound conversations that keep backend credentials server-side and isolate callers.
- Connected the eight-tool AquaPortal catalog through authenticated Streamable HTTP with full input schemas and structured results.
- Added bounded multi-step tool execution with cancellation, expiry, and stale-result protection.
- Updated browser bootstrap, tool progress, reasoning headers, and conversation cleanup.
- Disabled legacy unscoped content preloads in MCP mode and documented configuration and deployment constraints.
- Preserved disabled-mode contracts and added local SDK, WebSocket, and browser regression coverage.

Reviewed-on: AquaPortal/s2s#1
2026-10-08 08:49:39 -04:00

79 lines
1.9 KiB
TOML

[build-system]
requires = ["setuptools>=68", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "vocero-api"
version = "0.1.0"
description = "FastAPI integration and realtime proxy for the Vocero frontend"
readme = "README.md"
requires-python = ">=3.12,<3.13"
dependencies = [
"fastapi==0.115.6",
"uvicorn[standard]==0.34.0",
"httpx==0.28.1",
"python-dotenv==1.2.2",
"pydantic==2.13.5",
"websockets==17.2",
"mcp==1.29.0",
"jsonschema==4.26.0",
]
[dependency-groups]
dev = [
"mypy>=1.16,<2",
"pre-commit>=4.4,<5",
"pytest>=9,<10",
"ruff>=0.12,<1",
"types-jsonschema>=4.26.0.20261006",
]
[tool.uv]
required-version = "==0.12.5"
[tool.setuptools.packages.find]
include = ["vocero_api*"]
[tool.ruff]
target-version = "py312"
line-length = 120
include = ["pyproject.toml", "vocero_api/**/*.py", "server.py", "tests/**/*.py", "scripts/**/*.py"]
[tool.ruff.lint]
select = ["E4", "E7", "E9", "F", "I", "B", "UP"]
ignore = ["UP040", "UP046"]
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
line-ending = "auto"
[tool.mypy]
python_version = "3.12"
plugins = ["pydantic.mypy"]
files = ["vocero_api", "server.py"]
check_untyped_defs = true
disallow_untyped_defs = true
no_implicit_optional = true
strict_equality = true
warn_redundant_casts = true
warn_return_any = true
warn_unused_configs = true
warn_unused_ignores = true
show_error_codes = true
pretty = true
[tool.pydantic-mypy]
init_typed = true
warn_untyped_fields = true
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["."]
# Starlette 0.41.3 uses an alias deprecated by AnyIO 4.15. Keep the runtime
# versions used for compatibility captures; remove this test-only exception
# when upgrading Starlette. Upstream: https://github.com/Kludex/starlette/issues/3497
filterwarnings = [
'ignore:^The anyio\.abc\.BlockingPortal alias is deprecated, use anyio\.from_thread\.BlockingPortal instead\.$:DeprecationWarning:^starlette\.testclient$',
]