Option C Tools
Loading...
Searching...
No Matches
__main__.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3# oct/mcp/__main__.py
4
5"""
6Entry point for ``python -m oct.mcp``.
7
8Usage
9-----
10 python -m oct.mcp [--project-root PATH] [--profile PROFILE]
11 [--transport {stdio,sse}] [--host HOST] [--port PORT]
12 [--metrics-port PORT]
13
14Options
15-------
16--project-root PATH
17 Absolute or relative path to the Option C project root.
18 Defaults to auto-discovery from the current working directory.
19
20--profile PROFILE
21 MCP security profile: ``default``, ``strict``, or ``airgapped``.
22 Overrides ``OCT_MCP_PROFILE`` and the config file value.
23
24--config PATH
25 Path to the user-level config file.
26 Defaults to ``~/.oct-mcp/config.json``.
27
28--transport {stdio,sse}
29 MCP transport. ``stdio`` (default) for local AI host integration
30 (Claude Code, Cursor, VS Code). ``sse`` for HTTP/SSE remote access.
31
32--host HOST
33 Bind host for SSE transport (default: ``127.0.0.1``).
34 Only used with ``--transport sse``. Use ``0.0.0.0`` with caution
35 and only behind a reverse proxy with TLS and authentication.
36
37--port PORT
38 Bind port for SSE transport (default: ``3001``).
39 Only used with ``--transport sse``.
40
41--metrics-port PORT
42 Start a Prometheus ``/metrics`` HTTP server on this port.
43 Disabled by default. Requires ``oct[metrics]`` to be installed.
44
45Environment variables
46---------------------
47OCT_MCP_SAFE_MODE=1 Block all tool calls (emergency kill-switch).
48OCT_TRUST_REPO_CONFIG=1 Trust project-level config (debug_config.json).
49OCT_MCP_PROFILE=<name> Override active profile.
50OCT_MCP_SANDBOX=<name> Override sandbox backend (auto/native/bubblewrap/sandbox_exec).
51"""
52
53from __future__ import annotations
54
55import argparse
56import sys
57from pathlib import Path
58
59
60def _parse_args(argv: list[str] | None = None) -> argparse.Namespace:
61 parser = argparse.ArgumentParser(
62 prog="python -m oct.mcp",
63 description="Option C Tools MCP server.",
64 )
65 parser.add_argument(
66 "--project-root",
67 metavar="PATH",
68 default=None,
69 help="Project root directory (default: auto-discover from cwd).",
70 )
71 parser.add_argument(
72 "--profile",
73 choices=["default", "strict", "airgapped"],
74 default=None,
75 help="MCP security profile (default: from config or 'default').",
76 )
77 parser.add_argument(
78 "--config",
79 metavar="PATH",
80 default=None,
81 help="Path to ~/.oct-mcp/config.json (default: standard location).",
82 )
83 parser.add_argument(
84 "--transport",
85 choices=["stdio", "sse"],
86 default="stdio",
87 help=(
88 "MCP transport: 'stdio' (default) for local AI host integration, "
89 "'sse' for HTTP/SSE remote access."
90 ),
91 )
92 parser.add_argument(
93 "--host",
94 default="127.0.0.1",
95 help=(
96 "Bind host for SSE transport (default: 127.0.0.1). "
97 "Only used with --transport sse."
98 ),
99 )
100 parser.add_argument(
101 "--port",
102 type=int,
103 default=3001,
104 help="Bind port for SSE transport (default: 3001). Only used with --transport sse.",
105 )
106 parser.add_argument(
107 "--metrics-port",
108 type=int,
109 default=None,
110 metavar="PORT",
111 help=(
112 "Start a Prometheus /metrics HTTP server on this port. "
113 "Disabled by default. Requires oct[metrics]."
114 ),
115 )
116 return parser.parse_args(argv)
117
118
119def main(argv: list[str] | None = None) -> None:
120 """Parse CLI arguments and start the MCP server."""
121 args = _parse_args(argv)
122 config_path = Path(args.config) if args.config else None
123
124 try:
125 from oct.mcp.server import start_server
126 start_server(
127 project_root=args.project_root,
128 profile=args.profile,
129 config_path=config_path,
130 transport=args.transport,
131 host=args.host,
132 port=args.port,
133 metrics_port=args.metrics_port,
134 )
135 except KeyboardInterrupt:
136 sys.exit(0)
137
138
139if __name__ == "__main__":
140 main()
None main(list[str]|None argv=None)
Definition __main__.py:119
argparse.Namespace _parse_args(list[str]|None argv=None)
Definition __main__.py:60