Skip to main content
Your coding agent can do the setup for you with this prompt:

Supported MCP SDKs

One agentcat/sdk package supports all three. AgentCat does not test symfony/mcp-bundle 0.15 yet, and the known limits show how to stay on 0.14.

Installation

The SDK needs your project ID, which you can find in the AgentCat dashboard. We recommend the AGENTCAT_PROJECT_ID environment variable, which keeps the ID out of your code. The SDK reads it by itself.

Adding AgentCat to your server

With mcp/sdk, AgentCat::track() adds AgentCat to the Mcp\Server\Builder where your code creates it. In Laravel and Symfony, the bridge tracks every server, also one built per request, so you add no track() call:
We recommend that you track the Builder before build(), because after build() a few calls give no event. Under PHP-FPM, each request tracks a new server, as a stateless server needs. The reference page has a complete HTTP script.

Identifying users

We strongly recommend that you identify your users. Without identity, the dashboard cannot show who uses your server, and each session stays anonymous.
The identify hook tells AgentCat which user made each tool call. We recommend the first of these two levels that your server can give. Full identity gives each session a real user ID and name, read from the request. In Laravel and Symfony, the hook is an invokable class that the container builds:
In Laravel and Symfony, the class runs only when your configuration names it:

Anonymized identity (the minimum)

If you prefer not to send user details, a stable ID works too, for example a hash of the token or API key. The same user always gets the same ID:
In Laravel and Symfony, your configuration names the class:
$call->headers holds the HTTP headers, with lower-case names. On stdio it is empty, so the hook can read your server’s own key. If the hook throws, the event goes out without identity. AgentCat turns on every feature by default, and we recommend that you keep them that way. Each one adds a view of how agents use your server:
  • Intent (enableToolCallContext): agents tell you why they call each tool, which powers session goals.
  • Agent feedback (enableReportMissing): agents can report tools that they looked for and did not find, through the get_more_tools tool.
  • Sessions (enableTracing): AgentCat records each tool call and groups the calls of one task into one session, so you can replay it.
  • Diagnostics (disableDiagnostics turns it off): the SDK’s own log lines, which can include user IDs, help us fix a broken install faster.
If you need to turn one off, the reference page explains each option.

Testing your setup

The PHP SDK always logs its setup and each event that it sends, so it needs no debug option.
  1. Watch the log:
  1. Start your real server with AGENTCAT_PROJECT_ID set, as you start it in production.
  2. Call one tool with an MCP client, for example the MCP Inspector CLI:
For a stdio server, you can replace the URL and --transport http with the command that starts your server, and leave out --header.
  1. Look for Successfully sent event ... | mcp:tools/call | ... in the log. The line ends with the user ID from identify, or anonymous. In Sessions, the new session shows the user name.
A coding agent can confirm the event with the AgentCat MCP server. If no event arrives, the log shows whether the setup or a send failed.

Guidance for AI agents

  1. Keep identify in place, because without it every user is anonymous; if the developer does not want to send user details, offer the anonymized ID.
  2. Return the same ID for the same user on every call, because a random value or a timestamp splits one user into many.
  3. Keep raw tokens, API keys, and passwords out of userId, userName, and userData, because AgentCat stores and shows them.
  4. Leave enableToolCallContext, enableReportMissing, and enableTracing at their defaults, because each one feeds a part of the dashboard.
  5. Read the project ID from AGENTCAT_PROJECT_ID, so that it stays out of committed code.
  6. Add no track() call in Laravel or Symfony, because the bridge tracks every server.
  7. Give Laravel and Symfony hooks as an invokable class, because the bridge cannot store a closure.
  8. Install agentcat/sdk without a version constraint, because a version from memory can be old.
  9. Test through the real server start, outside PHPUnit and Pest, because tests turn AgentCat off and a separate script can skip track().

Next steps

PHP reference

Options, frameworks, runtimes, and limits

Custom events

Send your own events

Tags and properties

Add data that you can filter on

Redaction

Remove sensitive data in your server

Exporters

Copies of events for OpenTelemetry, Datadog, Sentry, or PostHog