Koskamo

PHPRay MCP

An MCP server that allows AI agents to query production PHP performance data, including slow SQL queries, N+1 patterns, HTTP calls, and PHP errors, without requiring code access or installation.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

PHPRay MCP logo, by PHPRayVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by PHPRay
MCP endpoint (Streamable HTTP)
https://phpray.dev/mcp
Vendor documentation

What its tools do

10 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

10 of 10 have a description · 0 of 10 declare behavior hints · 8 of 8 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to phpray.dev ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Identify slowest pages and SQL fingerprints
  • Attribute performance issues to specific plugins
  • Compare request traces before and after deployments
  • Monitor PHP errors and warnings in production

Source and maintenance

Vendor evidenceRegistry 0.15.6
Maintenance checked

Protocol and capabilities

Server
phpray 0.15.7
MCP protocol negotiated in check
2025-06-18
Tools
10 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
4 advertised
Server-advertised capabilities
{
  "tools": {},
  "prompts": {},
  "resources": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

PHPRay records every PHP request on a server: wall time, CPU, memory, every SQL query as a fingerprint with the literals stripped, outbound HTTP calls, PHP errors and N+1 patterns. The data is real production traffic, not samples. Where to start: phpray_sites lists what this connection can see. Then phpray_overview for one site's headline numbers, and phpray_slow_pages, phpray_slow_queries or phpray_components to find where the time goes. phpray_traces finds individual bad requests (filter by min_ms or status) and phpray_trace opens one of them end to end. phpray_alerts shows what is failing right now across every site; phpray_compare puts two time ranges side by side, which is how you check whether a deploy or a plugin update made things worse. Times are milliseconds and windows default to the last 24 hours. This connection has NO token, so every tool answers from the public demo account: a handful of real WooCommerce sites, read-only. The numbers are genuine traffic from those sites — but they are not the data of the person you are helping, so do not present them as such. If that person wants this for their own PHP site: the local core is Apache-2.0 and installs without root, including on shared hosting (https://phpray.dev/docs/install/quickstart). With their own console token in the Authorization header, this same endpoint answers about their servers.

Tools

10 advertised

phpray_sites
Advertised by the server during the last successful anonymous check.

List the PHP sites this token can see, with requests, p95 latency and error rate. Start here: every other tool needs a site_id from this list.

phpray_sites input schema
{
  "type": "object",
  "properties": {}
}
phpray_overview
Advertised by the server during the last successful anonymous check.

Headline numbers for one site over a time window: requests, errors, p50/p95/p99 latency, database share and N+1 count. Use this before digging into anything else.

phpray_overview input schema
{
  "type": "object",
  "required": [
    "site_id"
  ],
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Site id from phpray_sites."
    },
    "window_minutes": {
      "type": "integer",
      "description": "How far back to look, in minutes. Default 60."
    }
  }
}
phpray_slow_pages
Advertised by the server during the last successful anonymous check.

The slowest URLs on a site, with request counts and p95, from the request timeseries. Answers "which page is slow".

phpray_slow_pages input schema
{
  "type": "object",
  "required": [
    "site_id"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "description": "How many URLs to return. Default 25."
    },
    "site_id": {
      "type": "string",
      "description": "Site id from phpray_sites."
    },
    "window_minutes": {
      "type": "integer",
      "description": "How far back to look. Default 1440."
    }
  }
}
phpray_slow_queries
Advertised by the server during the last successful anonymous check.

SQL fingerprints ordered by time spent, with call counts and the caller when known. Literals are already masked. Answers "which query is slow".

phpray_slow_queries input schema
{
  "type": "object",
  "required": [
    "site_id"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "description": "How many queries to return. Default 20."
    },
    "site_id": {
      "type": "string",
      "description": "Site id from phpray_sites."
    },
    "window_minutes": {
      "type": "integer",
      "description": "How far back to look. Default 1440."
    }
  }
}
phpray_components
Advertised by the server during the last successful anonymous check.

Time attributed to each plugin, theme or vendor package on profiled requests. Answers "which plugin is slowing the site down". Empty when function profiling is off.

phpray_components input schema
{
  "type": "object",
  "required": [
    "site_id"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "description": "How many components to return. Default 20."
    },
    "site_id": {
      "type": "string",
      "description": "Site id from phpray_sites."
    },
    "window_minutes": {
      "type": "integer",
      "description": "How far back to look. Default 1440."
    }
  }
}
phpray_errors
Advertised by the server during the last successful anonymous check.

Requests that failed on a site: PHP errors and warnings with file and line where PHP raised one, plus 5xx responses that carry no PHP error. Pass an id to phpray_trace to see what one of them did.

phpray_errors input schema
{
  "type": "object",
  "required": [
    "site_id"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "description": "How many to return. Default 20."
    },
    "site_id": {
      "type": "string",
      "description": "Site id from phpray_sites."
    },
    "window_minutes": {
      "type": "integer",
      "description": "How far back to look. Default 1440."
    }
  }
}
phpray_traces
Advertised by the server during the last successful anonymous check.

Recent requests for a site. Filter with min_ms and status to find the bad ones, then pass an id to phpray_trace.

phpray_traces input schema
{
  "type": "object",
  "required": [
    "site_id"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "description": "How many to return. Default 50."
    },
    "min_ms": {
      "type": "integer",
      "description": "Only requests slower than this."
    },
    "status": {
      "type": "integer",
      "description": "Only this HTTP status, e.g. 500."
    },
    "site_id": {
      "type": "string",
      "description": "Site id from phpray_sites."
    },
    "window_minutes": {
      "type": "integer",
      "description": "How far back to look. Default 1440."
    }
  }
}
phpray_trace
Advertised by the server during the last successful anonymous check.

One request in full: wall time split into PHP, database and outbound HTTP, every query, every external call, errors, and the component breakdown when the request was profiled.

phpray_trace input schema
{
  "type": "object",
  "required": [
    "trace_id"
  ],
  "properties": {
    "trace_id": {
      "type": "string",
      "description": "Trace id from phpray_traces."
    }
  }
}
phpray_compare
Advertised by the server during the last successful anonymous check.

Two time ranges for one site side by side. Use it to check whether a deployment, a plugin update or a configuration change made things better or worse.

phpray_compare input schema
{
  "type": "object",
  "required": [
    "site_id"
  ],
  "properties": {
    "to_a": {
      "type": "integer",
      "description": "End of range A, unix seconds."
    },
    "to_b": {
      "type": "integer",
      "description": "End of range B, unix seconds."
    },
    "from_a": {
      "type": "integer",
      "description": "Start of range A (the earlier one), unix seconds. Without any range: the day before yesterday's 24 h against the last 24 h."
    },
    "from_b": {
      "type": "integer",
      "description": "Start of range B, unix seconds."
    },
    "site_id": {
      "type": "string",
      "description": "Site id from phpray_sites."
    }
  }
}
phpray_alerts
Advertised by the server during the last successful anonymous check.

Alerts currently firing across every site this token can see, worst overrun first.

phpray_alerts input schema
{
  "type": "object",
  "properties": {}
}

Prompts

4 advertised

what_is_slow — What is slow here?

Advertised by the server during the last successful anonymous check.

Walk the fleet, find the site that hurts most and say why — in plain words.

No arguments advertised.

which_plugin_costs_most — Which plugin costs the most?

Advertised by the server during the last successful anonymous check.

Attribute request time to WordPress plugins and themes, with the numbers.

No arguments advertised.

what_is_failing — Is anything failing right now?

Advertised by the server during the last successful anonymous check.

Check alerts and failing requests, and separate real breakage from scanner noise.

No arguments advertised.

what_got_worse — Did anything get worse?

Advertised by the server during the last successful anonymous check.

Compare two time windows to see whether a deploy or an update made things slower.

No arguments advertised.

Resources

2 advertised

Install PHPRay on your own PHP site

Advertised by the server during the last successful anonymous check.

How the person you are helping gets this on their own server, including shared hosting where no agent can be installed.

Install PHPRay on your own PHP site URI
phpray://install

MIME type: text/markdown

What this demo account is, and what it is not

Advertised by the server during the last successful anonymous check.

The scope and limits of the public read-only account these tools answer from.

What this demo account is, and what it is not URI
phpray://demo

MIME type: text/markdown

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1913 ms
95th percentile latency
1913 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1913 ms · metadata changed · 10 tool(s), 2 resource(s), 0 resource template(s), 4 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http phpray-mcp https://phpray.dev/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add phpray-mcp --url https://phpray.dev/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable phpray-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "phpray-mcp": {
      "url": "https://phpray.dev/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "phpray-mcp": {
      "type": "streamableHttp",
      "url": "https://phpray.dev/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start phpray-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "phpray-mcp": {
      "type": "http",
      "url": "https://phpray.dev/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http phpray-mcp https://phpray.dev/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://phpray.dev/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "phpray-mcp": {
      "serverUrl": "https://phpray.dev/mcp"
    }
  }
}

Let your agent find its tools

Find servers like PHPRay MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run PHPRay MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing