苹果 MCP 工具 ✅
SaferSkills independently audited mcpx (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
mcpx turns registered MCP servers into an agent-friendly command surface. Use it when a task needs MCP-backed services such as PostHog, Sentry, Cloudflare, or another server registered in the user's global mcpx registry.
mcpx directly.mcpx <server> <tool> --input <json>.--input; do not invent flags for MCP tool fields.~/.agents/mcpx/servers.json or token cache files unless the user explicitly asks for registry surgery.At the start of an MCP task, run bare mcpx to list configured servers:
mcpxChoose the likely server from the user's request, then inspect only that server's schema:
mcpx --schema=.sentry
mcpx --schema=.posthogAfter that, narrow to the specific tool or a short candidate list:
mcpx --schema=.posthog.projects-get
mcpx --schema='.posthog.{projects-get,alerts-list,alert-create}'Avoid mcpx --schema unless the user explicitly asks for the complete command surface. On a real registry it may expand every server schema and waste the agent context.
Use inline JSON/JSON5 for tiny inputs:
mcpx posthog projects-get --input '{}'
mcpx sentry search-issues --input '{"query":"is:unresolved"}'For non-trivial payloads, prefer @file or heredoc input:
mcpx <server> <tool> --input @payload.json
mcpx <server> <tool> --input @- <<'JSON'
{
"query": "is:unresolved"
}
JSONDefault output is optimized for agents (YAML for structured content, direct text passthrough, media saved as file saved <path>). Use --raw to disable that optimization. When a tool emits notifications, --raw output may also include a JSON envelope — see Notifications below.
mcpx supports two MCP transports, both configured through mcpx @add:
mcpx @add --name fs --transport stdio --command bunx --args -y --args @modelcontextprotocol/server-filesystem --args /tmp/fs-sandbox.
HTTP bearer auth uses --bearer. Prefer env:NAME so secrets stay out of the registry. Repeat --bearer for multiple credentials; mcpx uses round-robin by default:
mcpx @add --name posthog --url https://mcp.posthog.com/mcp \
--bearer env:POSTHOG_TOKEN_A \
--bearer env:POSTHOG_TOKEN_BAfter registration both behave identically from the agent's view: same schema discovery, same mcpx <server> <tool> --input ... call pattern, same output shape. You do not need to differentiate when calling tools.
Most tools emit no notifications and this section never applies.
When an MCP server emits events during a call (progress reporting, server-side state changes, custom events), mcpx merges them into default structured output under an injected $notifications field:
count: 1
$notifications:
- method: notifications/progress
params:
progressToken: '...'
progress: 3
total: 4
message: step 3For non-JSON text, binary, or mixed content, mcpx falls back to the trailing sentinel line:
<tool result lines>
$notification: [{"method":"notifications/progress","params":{...}}]Notifications are objects with these fields:
method — MCP notification method nameparams — method-specific payload (shape depends on method)aggregatedCount — only on the last notifications/progress entry perprogress token; indicates that N intermediate progress entries were collapsed to keep output bounded. The first and last entries are preserved verbatim.
Notification methods you may encounter:
| method | meaning |
|---|---|
notifications/progress | Progress for a long-running tool. Carries { progressToken, progress, total?, message? }. |
notifications/tools/list_changed | Server's tool schema changed. mcpx automatically refreshes the registry; you do not need to react. |
$oversize | Synthetic raw-mode marker. Means notifications were saved to a temp JSON file. Default output renders this as notifications oversize, saved to <path>. |
other (e.g. notifications/custom/*) | Passed through verbatim. Server-specific. |
In --raw mode with a structured result and non-empty notifications, the trailing sentinel line is replaced by a JSON envelope on stdout:
{ "result": <tool-result>, "notifications": [ ... ] }Text results keep the trailing $notification: line even under --raw, because text content is not JSON and wrapping it would break consumers.
Practical guidance:
$notifications, the sentinel line, or the raw envelope only when present.$notification: at all.When the user has already configured the relevant global MCP servers and wants a project to expose only that approved set to agents, generate a project-local mcpx skill:
mcpx @skill --servers posthog,sentryThis writes:
.agents/skills/mcpx/SKILL.mdUse the generated project skill as the project-specific router. It should name servers the user has already made available; do not use this flow to register or authenticate new MCP servers.
For temporary agent guidance without writing .agents/skills, print a single-server skill to stdout:
mcpx @skill --show slackUse this when the user asks for a one-off service action during the current agent session and does not want persistent project skills.
mcpx maintains a background daemon (mcpxd) for session reuse and notification buffering. You normally do not need to interact with it. If a tool call behaves unexpectedly (stuck session, surprising eviction, schema drift), see references/daemon.md before filing an issue.
If mcpx behaves unexpectedly, capture the exact command, schema selector, input, and structured error, then file an issue:
gh issue create -R AIGC-Hackers/mcpx --title "bug: <summary>" --body "<repro steps and error output>"~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.