phocinae-mcp
Officialphocinae-mcp
把斑海豹的命令审批门与 P0 推理协议暴露为 MCP 工具(gate / classify / route / score),接入只读 MCP 的编码代理。双代协议并存:现代面(2026-07-28,含 server/discover、MRTR 交互、Streamable HTTP)与 2024-11-05 旧客户端兼容。
斑海豹生态的 MCP server:把斑海豹的命令审批与推理能力以 4 个工具暴露给 MCP 客户端。纯标准库(Python ≥ 3.8,零第三方依赖),支持 stdio 与 Streamable HTTP 两种传输,MCP 2026-07-28 对齐并兼容 2024-11-05 旧客户端。
本仓库为本地增强版(基于 PyPI phocinae-mcp 0.1.1),仅用于本地开发与 协议对齐验证,不发布。
Install (local enhanced build)
git clone https://github.com/Phocinae/phocinae-mcp.git
cd phocinae-mcp
python3 -m pip install .
phocinae-mcp --helpThis repository is a local enhanced build and is not the PyPI release; the registry entry and the package below refer to the same server contract.
Related MCP server: DeadBolt
工具
工具 | 作用 | 输入 | 输出 |
| 判定 shell 命令能否执行 |
|
|
| 把状态归入候选标签之一 |
|
|
| 从候选工具中选最合适的一个 |
|
|
| 按标准给状态打 2–10 分 |
|
|
fail-closed:斑海豹 P0 服务(/v1/systemone)不可用、超时、应答异常时,
gate 一律返回 deny(带原因),classify/route/score 返回 isError: true。
传输方式
stdio(默认)
python3 -m phocinae_mcp --server http://127.0.0.1:8155MCP 客户端以子进程方式拉起,走 stdin/stdout 逐行 JSON-RPC 帧。
stdout 纯净性保证:stdout 只输出 JSON-RPC 帧;一切日志(启动、告警、
工具内部异常)只走 stderr(phocinae-mcp[level]: 前缀)。guard.py 导入期
的打印也被重定向到 stderr,不会污染协议通道。
Streamable HTTP(新增,2026-07-28)
python3 -m phocinae_mcp --transport http --host 127.0.0.1 --port 8255
# --port 0 → 随机端口(测试用);端口号打印在 stderr仅回环绑定:
--host只接受127.0.0.1/localhost/::1, 其他地址直接拒绝启动(exit 2);端点
POST /mcp;通知 →202 Accepted(空 body);请求 →200单对象 JSON;请求头强制(Server Validation):
MCP-Protocol-Version必带且须受 支持(否则400+-32020/-32022)、Mcp-Method必带且等于 body 的 method(tools/call、resources/read还必带Mcp-Name等于name/uri),违者400 -32020;Accept未含application/json/text/event-stream→406;未知方法 →404 -32601;GET/DELETE→405(2026-07-28 已移除 GET 流与会话终结端点);无会话头(
Mcp-Session-Id)、无 SSE 恢复缓冲——无状态服务,可任意重启。
环境变量:PHOCINAE_MCP_TRANSPORT=stdio|http、PHOCINAE_MCP_HTTP_PORT
可替代命令行开关。
协议对齐(2026-07-28)
双代并存,按请求逐条分派:
带
params._meta(含io.modelcontextprotocol/*键)的请求、以及server/discover、resources/*→ 现代面;initialize握手、无_meta的请求 → 旧年代(2024-11-05 行为, 与原版 0.1.x 一致)。
现代面补足项:
项 | 实现 |
| 必实现: |
| 逐请求必填 |
| 一切结果携带( |
|
|
多轮交互(MRTR) |
|
resources |
|
已移除方法 | 现代面下 |
工具 schema 收紧 |
|
description 重写 | 四工具均按「何时使用 / 何时不使用」结构重写 |
日志 | 全部走 stderr; |
兼容性:旧客户端 initialize 握手返回 2024-11-05 能力;无 _meta 的
tools/list/tools/call 按旧年代应答(不报错)——对旧客户端零破坏。
运行
# stdio(默认)
python3 -m phocinae_mcp [--server http://127.0.0.1:8155] [--timeout 5]
[--guard /path/to/guard.py] [--l1-enabled] [--model <name>]
# Streamable HTTP
python3 -m phocinae_mcp --transport http [--host 127.0.0.1] [--port 8255]
python3 -m phocinae_mcp --version--guard:复用 phocinae-guard 的 guard.py(L0 确定性表 + L1 编排),自动
探测同级 ../phocinae-guard/guard.py;找不到则 gate 降级为纯 HTTP
noul+score 两问(engine: "http:noul+score")。导入 guard 时不写
__pycache__(只读复用)。
测试
python3 tests/test_mcp.py # stdio 双代全流程冒烟 → tests/mcp_smoke.txt
python3 tests/test_http.py # Streamable HTTP 冒烟 → tests/http_smoke.txttest_mcp.py:模拟 MCP 客户端,走 stdio 依次执行旧年代 initialize → notifications/initialized → ping → tools/list → tools/call 全工具矩阵(含失败分支)→ shutdown;现代年代 discover → tools/list → 全工具矩阵(gate allow/deny/ask、MRTR 接受/拒绝/取消/篡改、fail-closed、 schema 越限、-32602/-32022/-32601、resources)→ 通知。同时对 stdout 逐行审计(每行必须是 JSON-RPC 帧、日志零泄漏、无 traceback)。test_http.py:HTTP 头校验矩阵(-32020/-32022/406/405/404/202)+ MRTR 全链路 + resources。两个测试共用
tests/mock_systemone.py(确定性 mock P0 服务,不跑模型)。
目录
phocinae_mcp/
├── server.py 主程序:双代分派、MRTR、CLI(stdio/http)
├── http_transport.py Streamable HTTP(新增)
├── protocol.py 2026-07-28 共享件(新增):版本/错误码/_meta 校验/
│ resultType/ttlMs/cacheScope/HMAC requestState/策略文本/日志门控
├── tools.py 四工具 + 收紧后的 schema(description 重写)
├── backend.py 斑海豹 P0 客户端(原版不动)
├── guard_bridge.py guard.py 复用桥(+stdout 纯净性防护)
└── __init__.py / __main__.py
tests/
├── test_mcp.py stdio 全流程冒烟 → mcp_smoke.txt
├── test_http.py HTTP 冒烟 → http_smoke.txt
└── mock_systemone.py 确定性 mock P0 服务安全声明(与斑海豹生态同口径)
gate的ask结果要求集成方把命令与理由呈现给人工,未获明确批准 不得执行(现代面走 elicitation 交互,旧年代走结果文本);判定结果不构成任何法律责任承诺;fail-closed 是唯一默认;
审批策略全文见资源
phocinae://policy/gate-approval(resources/read)。
Available Tools
4 toolsclassify分类A
何时使用:需要把一段状态/上下文归入若干已知标签之一(意图分类、类型识别)时。何时不使用:标签未知或不固定时(改走 route 或让模型自由作答);需要对同一对象打多重分数时(用 score)。返回 choice=选项下标(0 起)、label、置信度;服务不可用返回明确错误。
Inputs: state (required), labels (required), server. Returns: label, model, state, usage, +5 more
gate命令审批门A
何时使用:需要判定一条 shell 命令能否执行时——代码代理要跑命令、批处理要校验、人工要复核灰区命令,都用 gate 逐条判定。何时不使用:不要用它判定非 shell 操作(文件读写、HTTP 调用);不要把多条命令拼成一条字符串绕过判定;宿主已有内置审批机制时不要重复叠加。返回 decision ∈ allow|deny|ask 与 layer/reason;ask 时结果携带人工确认交互(MCP 2026-07-28 elicitation)或明示需人工复核;服务不可用 fail-closed 返回 deny。
Inputs: command (required), cwd, server. Returns: cwd, noul, tool, error, +13 more
route工具路由A
何时使用:有确定的候选工具/处理器清单、需要从中挑出最合适的一个来服务请求时。何时不使用:候选清单不固定或用户已直接指定工具时(尊重用户指定,不重复路由);要评估每个候选的质量而非挑选时(用 score 逐个打分)。返回 choice=下标、tool=选中的工具名;服务不可用返回明确错误。
Inputs: state (required), tools (required), server. Returns: tool, model, state, tools, +5 more
score打分A
何时使用:需要按 criteria 给 state 打 2–10 分(风险、质量、适配度等)时。何时不使用:需要分类(用 classify)、多选一(用 route 或 gate)、或分数语义与 2–10 量纲不符时。返回 score ∈ [2, 10] 与 range;服务不可用或应答越界返回明确错误。
Inputs: state (required), criteria (required), server. Returns: model, range, score, state, +5 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
Each tool targets a fundamentally different decision shape: gate = command allow/deny/ask, classify = pick one known label, route = pick one tool from a fixed candidate list, score = numeric 2–10 rating. The descriptions explicitly state when NOT to use each tool and cross-reference the alternatives (e.g. 'use route instead of classify when labels are unknown'; 'use score to rate each candidate'), which eliminates the usual classify/route/score overlap.
All four names are single lowercase English words with no camelCase/snake_case mixing, which is highly predictable. The only minor deviation is that gate reads as a noun/resource while classify, route, and score are verbs, but the concise one-word convention is still uniform.
Four tools is well within the ideal 3–15 range and each corresponds to a distinct decision primitive (permit, categorize, select, rate). Nothing feels padded or missing at the count level; the surface is tightly scoped to a decision/judgment layer.
The server covers the core judgment operations—ternary gating, closed-set classification, single-choice routing, and bounded scoring—with explicit fail-closed/error behavior, so no major workflow dead-ends. Minor gaps exist around batch/multi-item evaluation and combined multi-step decisions, but agents can chain the four tools to work around these.
Maintenance
Related MCP Connectors
Second Shift agent-native MCP server: a machine-readable front door to client leads.
MCP server for CertScore.ai public website risk-signal workflows.
Guard wraps stdio MCP servers: risky calls wait for a person; no answer, no run. Remote: cooperative
MCP server (stdio): check if URLs are alive (status, redirects, latency) via the AgentForge API
Related MCP Servers
- AlicenseAqualityBmaintenanceExperimental Python MCP server exposing traceguard_shield_exec to evaluate proposed tool calls through an authorization hook. Returns approval or rejection messages over stdio; it does not execute the requested tools.11MIT
- AlicenseAqualityBmaintenanceLocal execution gate and stdio MCP proxy for AI agents, with tool policies, expiring leases, approvals and operator kill. Starts with two read-only setup tools; protection requires a trusted downstream server and private operator configuration. Not an OS sandbox. Apache-2.0.25Apache 2.0
- AlicenseNot gradedqualityAmaintenanceServes three judgment tools over MCP stdio that return typed answers — yes/no, choice, and score — with calibrated probabilities instead of prose. It runs fully offline by default, requiring an explicit live provider and credential before any state leaves the host.66 npmApache 2.0
- AlicenseNot gradedqualityAmaintenanceExposes three decision tools over MCP stdio that return typed judgments — yes/no, choice, and score — with calibrated probabilities instead of prose. Runs on an offline mock unless a live provider credential is supplied, with a per-feature egress report printed to stderr.66 npmApache 2.0