1. Conduid
  2. Developer Tools
  3. Mcpcat Python SDK
MCP server · Developer Tools

Mcpcat Python SDK

AgentCat is an analytics platform for MCP server owners 🐱.

72Good

Scored 2 days ago · breakdown

About Mcpcat Python SDK

Mcpcat Python SDK is an MCP server published by agentcathq in the Developer Tools category: agentCat is an analytics platform for MCP server owners 🐱.

The repository has 53 stars and 9 forks, with the last commit 22 days ago. Recent commit activity is the strongest signal that reported issues will get attention.

Install

From source
git clone https://github.com/agentcathq/agentcat-python-sdk

This server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.

Ask AI

✦

Ask AI about Mcpcat Python SDK

Powered by Claude · Grounded in docs

I know everything about Mcpcat Python SDK. Ask me about installation, configuration, usage, or troubleshooting.

Security checks

Static checks derived from the repository 4 days ago. Heuristics on the source, not an audit.

  • ✓README presentThe repository ships documentation.
  • ✓License declaredUsable under a stated license.
  • ✓Tests presentA test suite exists in the repository.
  • !Dependencies pinnedNo lockfile. Installs can pull different code over time.
  • ✓No dynamic code executionSource scan found no eval, dynamic Function, or shell execution.
  • !Scoped permissionsDoesn't declare a permission scope. Assume it can do anything its process can.

Releases

v2.1.0AgentCat v2.1.0 — sturdier session handles: IDs issued first, structured mcp_session status · 31 Aug 2026AgentCat v2.1.0 makes explicit session handles sturdier and easier for agents to consume. There are no `track()` API changes — the delta is in the wire contract between your server and the agent. What's new IDs are issued at the start of…
v2.0.2AgentCat v2.0.2 — event-level redact_event hook · 8 Aug 2026AgentCat now supports an event-level `redact_event` hook, matching the `redactEvent`/`RedactEvent` hooks already available in the TypeScript and Go SDKs — plus a round of hardening on top after an adversarial review of the new surface.…
v2.0.1AgentCat v2.0.1 — FastMCP Code Mode support · 6 Aug 2026AgentCat now fully supports servers built on FastMCP Code Mode — and, more generally, any server that calls itself mid-request: catalog meta-tools fetching the hidden catalog, sandboxes chaining tools through `call_tool`, one tool…
v2.0.0AgentCat v2.0.0 — explicit handles for sessionless MCP, and MCP Python SDK v2 support · 5 Aug 2026AgentCat v2 rebuilds task correlation for the sessionless MCP era — and adds full support for MCP Python SDK v2. Why v2 The MCP 2026-07-28 specification removed protocol-level sessions. SEP-2567 eliminated the `initialize` handshake and…
v0.1.15v0.1.15 — final mcpcat release (renamed to agentcat) · 4 Jul 2026MCPcat is now AgentCat 🐱 — same team, same product, new name. This is the final release of the `mcpcat` package. It has been renamed to `agentcat` (`pip install agentcat`, starting fresh at v1.0.0). No functional or dependency changes —…

README

[!NOTE] AgentCat v2 introduces compatibility with the MCP Protocol "Stateless" 2026-07-28 Update and the coinciding MCP Python SDK v2 release that puts it into effect. The stateless transition has a massive impact on analytics, as sessions were a built-in concept tying related tool calls together. AgentCat has now migrated its session tracking under guidance of the MCP core team's recommendations of using explicit handles (SEP-2567).

As a result AgentCat now injects a session_id on every MCP tool call to associate them under the same task umbrella. Our evals show much higher tool correlation accuracy at the cost of < 1% additional context pollution.

[!IMPORTANT] MCPcat is now AgentCat 🐱 — same team, same product, new name. This package was previously published as mcpcat, which keeps working forever, but new features land here. Upgrading takes a few minutes — see the migration guide.

AgentCat is an analytics platform for MCP server owners 🐱. It captures user intentions and behavior patterns to help you understand what AI users actually need from your tools — eliminating guesswork and accelerating product development all with one-line of code.

This SDK also provides a free and simple way to forward telemetry like logs, traces, and errors to any Open Telemetry collector or popular tools like Datadog and Sentry.

# Basic installation (includes official MCP SDK)
pip install agentcat

# With community FastMCP support
pip install "agentcat[community]"

To learn more about us, check us out here. For detailed guides visit our documentation.

Why use AgentCat? 🤔

AgentCat helps builders of MCP servers, Claude Connectors, and ChatGPT Plugins learn how to improve them by capturing any agents goals and detecting when they get stuck.

Use AgentCat for:

  • Agent session replay 🎬. Follow alongside your users and their agents to understand why they're using your MCP servers, what functionality you're missing, and what clients they're coming from.
  • Trace debugging 🔍. See where your users are getting stuck, track and find when LLMs get confused by your API, and debug sessions across all deployments of your MCP server.
  • Existing platform support 📊. Get logging and tracing out of the box for your existing observability platforms (OpenTelemetry, Datadog, Sentry) — eliminating the tedious work of implementing telemetry yourself.

How it works

AgentCat works as a lightweight middleware inside your MCP server. When you call track(), it seamlessly modifies your registered tool schemas in place, following the MCP core team's explicit handles (SEP-2567) guidelines. Concretely, AgentCat adds the following to your server:

  • session_id — a parameter injected into each tool's input schema. Agents echo it back on every call, letting AgentCat group related tool calls into one task even over stateless transports. Values are validated: anything AgentCat did not issue is rejected rather than adopted, and the agent is told to re-send the ID it was given.
  • agent_id (off by default) — enabled with enable_agent_tracking=True. Each agent self-generates its own ID, keeping parallel agents working the same task individually attributable.
  • context — a parameter asking the agent to explain, in one sentence, why it is making this call. This is where intent data comes from.
  • get_more_tools — an additional tool, prompt-engineered so that agents readily report the features and tools they looked for but couldn't find — surfacing your missing functionality directly from real usage.

Injected parameters are stripped from arguments before your tool handler runs, so your code never sees them. For tools that declare an output schema, issued IDs are also mirrored into structuredContent (as _mcp_instructions), so clients that only read structured results still receive them.

Getting Started

To get started with AgentCat, first create an account and obtain your project ID by signing up at agentcat.com. For detailed setup instructions visit our documentation.

Once you have your project ID, integrate AgentCat into your MCP server:

import agentcat
from mcp.server.mcpserver import MCPServer

server = MCPServer("echo-mcp", version="0.1.0")

@server.tool(description="Echo a message")
def echo(msg: str) -> str:
    return msg

# Track the server with AgentCat
agentcat.track(server, "proj_0000000")

Stateless servers built on MCP 2026-07-28 create a fresh server instance per worker or per tenant, serving each request with stateless_http=True. Call track() inside the factory so every instance is tracked:

import agentcat
from mcp.server.mcpserver import MCPServer

def create_server() -> MCPServer:
    server = MCPServer("echo-mcp", version="0.1.0")
    # register tools...
    agentcat.track(server, "proj_0000000")
    return server

server = create_server()
server.run(transport="streamable-http", stateless_http=True)

Calling track() per instance is cheap — the event queue, telemetry exporters, and diagnostics are initialized once and shared across instances.

Identifying users

We strongly encourage identifying every actor. If you can't resolve a real user, return a stable anonymized ID instead — for example, a hash of the auth token or API key — so that all events from the same end user still roll up to one actor in your dashboard rather than scattering into anonymous one-off sessions.

identify (like every AgentCat hook) may be sync or async and runs on every tool call, ahead of your handler: a hook that fails outright — or returns anything that is not a UserIdentity — costs analytics data for that event, never the call itself. Every hook runs under a 5-second cap, and a slow lookup delays that call's response — so keep it cheap, and add your own caching if it does a database or API lookup.

The callback receives the tool call's request params (.name and .arguments, a plain dict) and the request context the SDK hands to handlers — the same (request, extra) shape on every supported server flavor. On HTTP transports, identity signals like headers and auth live on extra.request:

from agentcat import AgentCatOptions, UserIdentity

async def identify(request, extra):
    http = getattr(extra, "request", None)  # incoming HTTP request, when present
    token = http.headers.get("authorization") if http else None
    org_id = http.headers.get("x-org-id") if http else None
    user = await myapi.get_user(token)
    if not user:
        return None
    return UserIdentity(user_id=user.id, user_name=user.name, user_data={"org_id": org_id})

agentcat.track(server, "proj_0000000", AgentCatOptions(identify=identify))

Redacting sensitive data

AgentCat redacts all data sent to its servers and encrypts at rest, but for additional security, it offers a hook to do your own redaction on all text data returned back to our servers.

from agentcat import AgentCatOptions

async def redact(text: str) -> str:
    return await redactor(text)
# or a plain sync function — both are supported

agentcat.track(server, "proj_0000000", AgentCatOptions(redact_sensitive_information=redact))

For redaction decisions that need more context than a single string — such as which tool was called or what type of event is being published — use the event-level redact_event hook. It receives the full event and returns a modified event, or None to drop the event entirely. It may be sync or async, runs before redact_sensitive_information (so it sees raw values), and can be combined with it.

Mutate the event you're given and return it, as in the example below — don't construct or return a different Event. The return value replaces the event's fields wholesale, not as a diff against the original, so returning a partial or freshly-built event will silently drop every field you didn't set.

from agentcat import AgentCatOptions

def redact_event(event):
    # Drop events from tools that handle secrets entirely
    if event.resource_name == "get_credentials":
        return None
    # Strip response payloads from a specific tool
    if event.resource_name == "export_report":
        event.response = None
    return event

agentcat.track(server, "proj_0000000", AgentCatOptions(redact_event=redact_event))

Vendor Support

AgentCat seamlessly integrates with your existing observability stack, providing automatic logging and tracing without the tedious setup typically required. Export telemetry data to multiple platforms simultaneously:

import os

from agentcat import AgentCatOptions

agentcat.track(
    server,
    "proj_0000",  # Project ID can optionally be None if you just want to forward telemetry
    AgentCatOptions(
        exporters={
            "otlp": {
                "type": "otlp",
                "endpoint": "http://localhost:4318/v1/traces",
            },
            "datadog": {
                "type": "datadog",
                "api_key": os.environ["DD_API_KEY"],
                "site": "datadoghq.com",
                "service": "my-mcp-server",
            },
            "sentry": {
                "type": "sentry",
                "dsn": os.environ["SENTRY_DSN"],
                "environment": "production",
            },
        }
    ),
)

Learn more about our free and open source telemetry integrations.

Internal diagnostics

To help us catch and fix broken installs, the SDK sends AgentCat a small, anonymized signal when setup or runtime errors occur — never your tool calls, your responses, or anything about your users. Records carry only operational metadata, such as your project ID (or an anonymous install ID when none is set). Your local ~/agentcat.log is unchanged.

Diagnostics are on by default and can be turned off completely with either:

  • track(server, project_id, AgentCatOptions(disable_diagnostics=True)), or
  • the DISABLE_DIAGNOSTICS environment variable.

Free for open source

AgentCat is free for qualified open source projects. We believe in supporting the ecosystem that makes MCP possible. If you maintain an open source MCP server, you can access our full analytics platform at no cost.

How to apply: Email hi@agentcat.com with your repository link

Already using AgentCat? We'll upgrade your account immediately.

Community Cats 🐱

Meet the cats behind AgentCat! Add your cat to our community by submitting a PR with your cat's photo in the docs/cats/ directory.

Want to add your cat? Create a PR adding your cat's photo to docs/cats/ and update this section!

README fetched from the repository 4 days ago. The original is authoritative.

Questions

About Mcpcat Python SDK

How do I install Mcpcat Python SDK?

No package has been published for this server, so install it from source: clone the repository and follow its README.

Is Mcpcat Python SDK safe to use with an AI agent?

Its trust score is 72 out of 100 (good). It passes 4 of the 6 static security checks run so far; the failures are listed above. It has no ConduID identity yet, so agent calls to it are not receipted.

Is Mcpcat Python SDK still maintained?

Yes — the latest release is v2.1.0 (31 Aug 2026), and the last commit was 22 days ago. The repository has 53 stars and 7 open issues.