mcpsignals (Python)
Drop-in instrumentation for MCP servers. Wrap your server, point it at a sink, and it records what agents did with your tools into a database you own - no hosted service, no account.
Requires Python 3.10 or newer. Targets the v2 mcp SDK (MCPServer /
low-level Server, mcp>=2.0.0).
Install
pip install mcpsignals
# with a warehouse sink:
pip install "mcpsignals[postgres]" # or [bigquery], [otlp]
Usage
from mcp.server.mcpserver import MCPServer
from mcpsignals import instrument
server = MCPServer("my-server")
instrument(server, server_name="my-server", server_version="1.0.0")
@server.tool()
def search(query: str) -> str:
"""Search something."""
return f"results for {query}"
Call instrument() any time before the server starts handling requests. It
appends to server.middleware, and that chain is rebuilt from the live list
on every request, so calling it before or after your @server.tool()
definitions makes no difference. The Node.js package differs here: it wraps
registerTool, so it has to run before any tool is registered.
With no sink configured it writes JSON lines to stdout. To write to your own warehouse instead:
from mcpsignals import instrument
from mcpsignals.sinks import PostgresSink
instrument(server, server_name="my-server", sinks=[PostgresSink(dsn="postgresql://...")])
Argument capture and redaction
Off by default: no tool arguments are recorded unless you opt in with
capture_arguments=True. Even then, by default only argument keys and
value types are recorded, never values. See the root README's redaction
section before enabling this in anything handling real user data.
Known limitation: session_id
mcp 2.0.0's middleware-facing ServerRequestContext does not publicly
expose the transport's connection-level session id (only the
handler-facing Context class does, via a private accessor middleware
doesn't have). session_id on emitted events is therefore only ever
populated when intent capture is enabled and the calling agent supplies
one - not from the underlying transport connection. See instrument.py
for details; this will be revisited if/when upstream exposes it to
middleware.
Full docs
See the root README for the redaction model, the sink
comparison, and intent capture, and schema/events.md
for the event field reference.
Release files for mcpsignals 2.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcpsignals-2.0.2.tar.gz | 16.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcpsignals-2.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.3 kB
Release files / mcpsignals-2.0.2.tar.gz
| Download URL | mcpsignals-2.0.2.tar.gz |
|---|---|
| Size | 16.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e16d576d4640b8086cb157241120a29d842c18a0fe45a80b0d9aa9c9eb55e2f4
|
|
BLAKE2b-256 checksum How to use checksums |
a2b094a17c77f0b3b01378599cd70d63622e6733472bccff78899d20101fa64f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency logRelease files / mcpsignals-2.0.2-py3-none-any.whl
| Download URL | mcpsignals-2.0.2-py3-none-any.whl |
|---|---|
| Size | 17.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
07d3b233d62fc6c6b79c0c84d80c60a34c48aaeb14b86e71f4fb6704d0672f99
|
|
BLAKE2b-256 checksum How to use checksums |
6a9573344c850ee1385aa35f0eda9dd4576ffee5f8c9d11971e6231100f1e7f1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency log