Make workspace-core the default MCP profile
Flip bare pyro mcp serve, create_server(), and Pyro.create_server() to default to workspace-core in 4.0.0 while keeping workspace-full as the explicit advanced opt-in surface. Rewrite the MCP-facing docs and host-specific examples around the bare default command, update package and catalog compatibility to 4.x, and move the public-contract wording from 3.x compatibility guidance to the new stable default. Adjust the server, API, and contract tests so bare server creation now asserts the workspace-core tool set, while explicit workspace-full coverage continues to prove shells, services, snapshots, and disk tools remain available. Validation: uv lock; .venv/bin/pytest --no-cov tests/test_cli.py tests/test_api.py tests/test_server.py tests/test_public_contract.py; UV_CACHE_DIR=.uv-cache make check; UV_CACHE_DIR=.uv-cache make dist-check; real guest-backed smoke for bare Pyro.create_server() plus explicit profile="workspace-full".
This commit is contained in:
parent
68d8e875e0
commit
c00c699a9f
25 changed files with 170 additions and 121 deletions
|
|
@ -462,11 +462,12 @@ class Pyro:
|
|||
allow_host_compat=allow_host_compat,
|
||||
)
|
||||
|
||||
def create_server(self, *, profile: McpToolProfile = "workspace-full") -> FastMCP:
|
||||
def create_server(self, *, profile: McpToolProfile = "workspace-core") -> FastMCP:
|
||||
"""Create an MCP server for one of the stable public tool profiles.
|
||||
|
||||
`workspace-full` remains the default for 3.x compatibility. New chat
|
||||
hosts should usually start with `profile="workspace-core"`.
|
||||
`workspace-core` is the default stable chat-host profile in 4.x. Use
|
||||
`profile="workspace-full"` only when the host truly needs the full
|
||||
advanced workspace surface.
|
||||
"""
|
||||
normalized_profile = _validate_mcp_profile(profile)
|
||||
enabled_tools = set(_PROFILE_TOOLS[normalized_profile])
|
||||
|
|
|
|||
|
|
@ -760,13 +760,13 @@ def _build_parser() -> argparse.ArgumentParser:
|
|||
help="Run the MCP server.",
|
||||
description=(
|
||||
"Run the MCP server after you have already validated the host and "
|
||||
"guest execution with `pyro doctor` and `pyro run`. Start most "
|
||||
"chat hosts with `workspace-core`."
|
||||
"guest execution with `pyro doctor` and `pyro run`. Bare `pyro "
|
||||
"mcp serve` now starts the recommended `workspace-core` profile."
|
||||
),
|
||||
epilog=dedent(
|
||||
"""
|
||||
Examples:
|
||||
pyro mcp serve --profile workspace-core
|
||||
pyro mcp serve
|
||||
pyro mcp serve --profile vm-run
|
||||
pyro mcp serve --profile workspace-full
|
||||
"""
|
||||
|
|
@ -778,22 +778,23 @@ def _build_parser() -> argparse.ArgumentParser:
|
|||
"serve",
|
||||
help="Run the MCP server over stdio.",
|
||||
description=(
|
||||
"Expose pyro tools over stdio for an MCP client. "
|
||||
"`workspace-core` is the recommended first profile for most chat hosts."
|
||||
"Expose pyro tools over stdio for an MCP client. Bare `pyro mcp "
|
||||
"serve` now starts `workspace-core`, the recommended first profile "
|
||||
"for most chat hosts."
|
||||
),
|
||||
epilog=dedent(
|
||||
"""
|
||||
Recommended first start:
|
||||
pyro mcp serve --profile workspace-core
|
||||
Default and recommended first start:
|
||||
pyro mcp serve
|
||||
|
||||
Profiles:
|
||||
workspace-core: recommended default for normal persistent chat editing
|
||||
workspace-core: default for normal persistent chat editing
|
||||
vm-run: smallest one-shot-only surface
|
||||
workspace-full: advanced 3.x compatibility surface for shells, services,
|
||||
workspace-full: advanced 4.x opt-in surface for shells, services,
|
||||
snapshots, secrets, network policy, and disk tools
|
||||
|
||||
`workspace-full` remains the default in 3.x for compatibility, but most new
|
||||
chat hosts should start with `workspace-core`.
|
||||
Use --profile workspace-full only when the host truly needs the full
|
||||
advanced workspace surface.
|
||||
"""
|
||||
),
|
||||
formatter_class=_HelpFormatter,
|
||||
|
|
@ -801,11 +802,11 @@ def _build_parser() -> argparse.ArgumentParser:
|
|||
mcp_serve_parser.add_argument(
|
||||
"--profile",
|
||||
choices=PUBLIC_MCP_PROFILES,
|
||||
default="workspace-full",
|
||||
default="workspace-core",
|
||||
help=(
|
||||
"Expose only one model-facing tool profile. `workspace-core` is the "
|
||||
"recommended first profile for most chat hosts; `workspace-full` "
|
||||
"preserves the current full MCP surface for 3.x compatibility."
|
||||
"Expose only one model-facing tool profile. `workspace-core` is "
|
||||
"the default and recommended first profile for most chat hosts; "
|
||||
"`workspace-full` is the explicit advanced opt-in surface."
|
||||
),
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -11,12 +11,13 @@ from pyro_mcp.vm_manager import VmManager
|
|||
def create_server(
|
||||
manager: VmManager | None = None,
|
||||
*,
|
||||
profile: McpToolProfile = "workspace-full",
|
||||
profile: McpToolProfile = "workspace-core",
|
||||
) -> FastMCP:
|
||||
"""Create and return a configured MCP server instance.
|
||||
|
||||
`workspace-full` remains the default for 3.x compatibility. New chat hosts
|
||||
should usually start with `profile="workspace-core"`.
|
||||
`workspace-core` is the default stable chat-host profile in 4.x. Use
|
||||
`profile="workspace-full"` only when the host truly needs the full
|
||||
advanced workspace surface.
|
||||
"""
|
||||
return Pyro(manager=manager).create_server(profile=profile)
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ from typing import Any
|
|||
from pyro_mcp.runtime import DEFAULT_PLATFORM, RuntimePaths
|
||||
|
||||
DEFAULT_ENVIRONMENT_VERSION = "1.0.0"
|
||||
DEFAULT_CATALOG_VERSION = "3.11.0"
|
||||
DEFAULT_CATALOG_VERSION = "4.0.0"
|
||||
OCI_MANIFEST_ACCEPT = ", ".join(
|
||||
(
|
||||
"application/vnd.oci.image.index.v1+json",
|
||||
|
|
@ -48,7 +48,7 @@ class VmEnvironment:
|
|||
oci_repository: str | None = None
|
||||
oci_reference: str | None = None
|
||||
source_digest: str | None = None
|
||||
compatibility: str = ">=3.0.0,<4.0.0"
|
||||
compatibility: str = ">=4.0.0,<5.0.0"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue