Skip to content

Add initial Transport and Streamable HTTP support - #44

Draft
3dgiordano wants to merge 3 commits into
developmentfrom
TRANSPORTS
Draft

Add initial Transport and Streamable HTTP support#44
3dgiordano wants to merge 3 commits into
developmentfrom
TRANSPORTS

Conversation

@3dgiordano

Copy link
Copy Markdown
Collaborator

This pull request introduces a new streamable HTTP transport for Perfecto MCP, allowing the server to handle multiple users and clouds over HTTP with per-request authentication via Bearer tokens and cloud selection via headers. It also refactors authentication and runtime context handling to support both stdio and HTTP transports, and updates documentation and CLI options accordingly.

New HTTP Transport and Authentication:

  • Adds a streamable HTTP transport mode to Perfecto MCP, allowing clients to connect over HTTP with credentials and cloud name resolved per request from headers. This enables a single server instance to serve multiple users and clouds concurrently. [1] [2]
  • Implements per-request Bearer authentication middleware (BearerAuthMiddleware) and cloud name resolution logic, with clear error handling for missing or malformed credentials. Health probe endpoints (/health, /healthz) bypass authentication for orchestration.
  • Updates the authentication and token parsing logic to support Bearer tokens and cloud name headers, including new helpers for context and user config resolution. [1] [2] [3]

Runtime and Context Refactoring:

  • Introduces a new AppRuntime class to encapsulate process-level transport, authentication, and user config, with logic to resolve and hydrate per-request context.
  • Updates main server wiring to select transport (stdio, http, docker) based on CLI, environment variables, or defaults, and builds the correct runtime and authentication wiring for each. [1] [2] [3]

Documentation and CLI Improvements:

  • Adds a new docs/hosted-http.md with detailed client configuration, header usage, auth behavior, environment variables, and limitations for HTTP transport. Updates README.md to reference the new transport and documentation. [1] [2]
  • Refines CLI argument parsing for --mcp, allowing explicit transport selection and improving help text. [1] [2] [3]

Supporting Changes:

  • Updates error messages and documentation to clarify the new authentication and cloud name mechanisms.
  • Ensures PyInstaller collects necessary uvicorn submodules for HTTP transport.
  • Minor type and import improvements for clarity and correctness.

References:
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]

Comment thread docs/hosted-http.md
## Limitations

- No session storage service: session state is not shared across server instances.
- File upload / local file access is not supported by Perfecto MCP on any transport.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we leave aside some sort of file upload in this MCP? If so, shouldn't we attempt to give support through a separated service?

Comment thread main.py
Comment on lines +115 to +116
host = "127.0.0.1"
port = 8000

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are this initializations needed at this point? What would happen with them if transport isn't http?

Comment thread main.py
Comment on lines +119 to +127
host = os.getenv("FASTMCP_HOST", "127.0.0.1").strip() or "127.0.0.1"
# Cloud Run injects PORT; prefer FASTMCP_PORT when set, else PORT, else 8000.
port_raw = (
os.getenv("FASTMCP_PORT")
or os.getenv("PORT")
or "8000"
).strip() or "8000"
port = int(port_raw)
streamable_http_path = os.getenv("FASTMCP_STREAMABLE_HTTP_PATH", "/mcp").strip() or "/mcp"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about resolving this construction elsewhere? Modularizing could improve the readability of the mcp building

Comment thread main.py
"Execute MCP Server. Optional TRANSPORT values: stdio, http, docker.\n"
"Resolution precedence: CLI > PERFECTO_MCP_TRANSPORT > stdio."
),
)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't this change force us to modify the Dockerfile entry point? Nowadays we aren't passing the docker argument. Only --mcp (former stdio)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants