spx-mcp-server
# SPX MCP Server
Web-only MCP server for `php-spx` reports. It calls the embedded SPX web endpoints, parses the full report, and returns LLM-sized JSON summaries instead of raw event streams.
## Prerequisites
- Node.js 20 or newer
- An application with the `spx` PHP extension enabled for HTTP profiling
- SPX HTTP access configured, for example:
```ini
spx.http_enabled=1
spx.http_key="dev"
spx.http_ip_whitelist="127.0.0.1"
```
## Build
```bash
npm install
npm run build
```
The built stdio entry point is:
```text
/path/to/spx-mcp-server/dist/index.js
```
Set these environment variables in your agent config, or pass them per tool call:
```text
SPX_BASE_URL=http://localhost
SPX_KEY=dev
```
## Install In Codex CLI
Edit `~/.codex/config.toml` and add:
```toml
[mcp_servers.spx]
command = "node"
args = ["/path/to/spx-mcp-server/dist/index.js"]
env = { SPX_BASE_URL = "http://localhost", SPX_KEY = "dev" }
```
Restart Codex CLI after editing the file.
## Install In Claude Code
Local project config:
```bash
claude mcp add --transport stdio --scope project \
--env SPX_BASE_URL=http://localhost \
--env SPX_KEY=dev \
spx -- node /path/to/spx-mcp-server/dist/index.js
```
User-wide config:
```bash
claude mcp add --transport stdio --scope user \
--env SPX_BASE_URL=http://localhost \
--env SPX_KEY=dev \
spx -- node /path/to/spx-mcp-server/dist/index.js
```
Verify:
```bash
claude mcp list
claude mcp get spx
```
Equivalent `.mcp.json` project config:
```json
{
"mcpServers": {
"spx": {
"type": "stdio",
"command": "node",
"args": ["/path/to/spx-mcp-server/dist/index.js"],
"env": {
"SPX_BASE_URL": "http://localhost",
"SPX_KEY": "dev"
}
}
}
}
```
## Install In Cline
Cline is a popular open-source VS Code agent with MCP support.
For Cline CLI, run:
```bash
cline mcp
```
Then add a local stdio server with:
```text
name: spx
command: node
args: /path/to/spx-mcp-server/dist/index.js
env:
SPX_BASE_URL=http://localhost
SPX_KEY=dev
```
For the VS Code extension, open the Cline MCP Servers settings and add this JSON:
```json
{
"mcpServers": {
"spx": {
"command": "node",
"args": ["/path/to/spx-mcp-server/dist/index.js"],
"env": {
"SPX_BASE_URL": "http://localhost",
"SPX_KEY": "dev"
},
"disabled": false,
"autoApprove": []
}
}
}
```
## Install In OpenClaw
OpenClaw is an open-source personal agent/gateway that can manage outbound MCP servers under `mcp.servers`.
Edit `~/.openclaw/openclaw.json` or the file pointed to by `OPENCLAW_CONFIG_PATH`:
```json5
{
mcp: {
servers: {
spx: {
command: "node",
args: ["/path/to/spx-mcp-server/dist/index.js"],
env: {
SPX_BASE_URL: "http://localhost",
SPX_KEY: "dev",
},
},
},
},
}
```
Check the saved config:
```bash
openclaw mcp status --verbose
openclaw mcp probe spx
```
## Basic Workflow
1. Call `profile_url` for the web URL you want to profile.
2. Call `list_reports`.
3. Pick the newest matching report.
4. Call `analyze_report` or `get_hot_paths`.
## Tools
- `profile_url`: sends one HTTP request with SPX cookies enabled.
- `list_reports`: reads `?SPX_UI_URI=/data/reports/metadata`.
- `get_report_metadata`: reads one report metadata JSON.
- `analyze_report`: downloads and parses `?SPX_UI_URI=/data/reports/get/<key>`.
- `get_hot_paths`: returns the most expensive call paths.
- `get_function_profile`: returns one function's aggregate and callers/callees.
- `get_raw_events`: returns a paginated debug slice of raw events.
The analyzer limits output by default. Large SPX reports can contain millions of events, so full raw report output is intentionally not exposed as a normal tool result. `get_raw_events` is capped at 1000 events per call and is intended for debugging parser or analyzer behavior.
## References
- Claude Code MCP configuration: https://code.claude.com/docs/en/mcp
- Cline MCP configuration: https://github.com/cline/cline/blob/main/docs/mcp/mcp-overview.mdx
- OpenClaw MCP configuration: https://docs.openclaw.ai/gateway/configuration-reference
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: profile_url initiates profiling, list_reports lists metadata, get_report_metadata retrieves specific metadata, analyze_report aggregates full data, get_hot_paths extracts hot paths, get_function_profile provides function-level analysis, and get_raw_events returns raw events. There is no ambiguity between them.
All tool names follow a consistent verb_noun pattern in lowercase snake_case (e.g., profile_url, list_reports, get_hot_paths). The verbs are clear and the naming is predictable throughout.
With 7 tools, the server is well-scoped for a profiling/analysis domain. Each tool covers a necessary operation without bloat, and the count is ideal for an agent to manage.
The tool set covers the core workflow: starting a profile, listing reports, retrieving metadata, performing full analysis, and extracting specific insights. Minor gaps exist (e.g., no explicit tool to stop a profile or delete reports), but these are likely outside the server's intended scope, and the remaining tools form a cohesive surface.