Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions sentry_sdk/_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,14 @@ class GenAICollectionBehaviour(TypedDict):
inputs: bool
outputs: bool

class MCPCollectionUserOptions(TypedDict, total=False):
inputs: bool
outputs: bool

class MCPCollectionBehaviour(TypedDict):
inputs: bool
outputs: bool

class GraphQLCollectionUserOptions(TypedDict, total=False):
document: bool
variables: bool
Expand All @@ -181,6 +189,7 @@ class DataCollectionUserOptions(TypedDict, total=False):
url_query_params: "KeyValueCollectionBehaviour"
graphql: "GraphQLCollectionUserOptions"
gen_ai: "GenAICollectionUserOptions"
mcp: "MCPCollectionUserOptions"
database_query_data: bool
queues: bool
stack_frame_variables: "Union[bool, KeyValueCollectionBehaviour]"
Expand All @@ -194,6 +203,7 @@ class DataCollection(TypedDict):
url_query_params: "KeyValueCollectionBehaviour"
graphql: "GraphQLCollectionBehaviour"
gen_ai: "GenAICollectionBehaviour"
mcp: "MCPCollectionBehaviour"
database_query_data: bool
queues: bool
stack_frame_variables: "Union[bool, KeyValueCollectionBehaviour]"
Expand Down
9 changes: 9 additions & 0 deletions sentry_sdk/data_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
GraphQLCollectionBehaviour,
HttpHeadersCollectionBehaviour,
KeyValueCollectionBehaviour,
MCPCollectionBehaviour,
)

# ``http_bodies`` defaults to this (collect everything the
Expand Down Expand Up @@ -180,6 +181,7 @@ def _resolve(
"url_query_params": _kvcb_from_value(d.get("url_query_params") or {}),
"graphql": _graphql_from_value(d.get("graphql") or {}),
"gen_ai": _gen_ai_from_value(d.get("gen_ai") or {}),
"mcp": _mcp_from_value(d.get("mcp") or {}),
"database_query_data": d.get("database_query_data", True),
"queues": d.get("queues", True),
"stack_frame_variables": stack_frame_variables,
Expand Down Expand Up @@ -225,6 +227,13 @@ def _gen_ai_from_value(val: "dict[str, Any]") -> "GenAICollectionBehaviour":
}


def _mcp_from_value(val: "dict[str, Any]") -> "MCPCollectionBehaviour":
return {
"inputs": val.get("inputs", True),
"outputs": val.get("outputs", True),
}


def _graphql_from_value(
val: "dict[str, Any]",
) -> "GraphQLCollectionBehaviour":
Expand Down
8 changes: 4 additions & 4 deletions sentry_sdk/integrations/mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ async def _instrument_tool_call(
client = sentry_sdk.get_client()
handler_name = ctx.params["name"]
arguments = ctx.params.get("arguments")
if arguments is None or not client.options["data_collection"]["gen_ai"]["inputs"]:
if arguments is None or not client.options["data_collection"]["mcp"]["inputs"]:
arguments = {}

# Get request ID, session ID, and transport from context
Expand Down Expand Up @@ -290,7 +290,7 @@ async def _instrument_tool_call(

if (
result_content is None
or not client.options["data_collection"]["gen_ai"]["outputs"]
or not client.options["data_collection"]["mcp"]["outputs"]
):
return result

Expand Down Expand Up @@ -324,7 +324,7 @@ async def _instrument_prompt_get(

arguments = ctx.params.get("arguments")

if arguments is None or not client.options["data_collection"]["gen_ai"]["inputs"]:
if arguments is None or not client.options["data_collection"]["mcp"]["inputs"]:
arguments = {}

# Get request ID, session ID, and transport from context
Expand Down Expand Up @@ -381,7 +381,7 @@ async def _instrument_prompt_get(

if (
message_count != 1
or not client.options["data_collection"]["gen_ai"]["inputs"]
or not client.options["data_collection"]["mcp"]["outputs"]
or not messages
):
return result
Expand Down
14 changes: 7 additions & 7 deletions tests/integrations/fastmcp/test_fastmcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ async def test_fastmcp_tool_sync(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -333,7 +333,7 @@ async def test_fastmcp_tool_sync_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -385,7 +385,7 @@ async def test_fastmcp_tool_async(sentry_init, capture_items, FastMCP, json_rpc)
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -460,7 +460,7 @@ async def test_fastmcp_tool_async_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -589,7 +589,7 @@ async def test_fastmcp_tool_with_complex_return(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -647,7 +647,7 @@ async def test_fastmcp_prompt_sync(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -714,7 +714,7 @@ async def test_fastmcp_prompt_sync_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down
30 changes: 15 additions & 15 deletions tests/integrations/mcp/test_mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ async def test_tool_handler_stdio(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -334,7 +334,7 @@ async def test_tool_handler_stdio_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -399,7 +399,7 @@ async def test_tool_handler_streamable_http(sentry_init, capture_items, json_rpc
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -476,7 +476,7 @@ async def test_tool_handler_streamable_http_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -654,7 +654,7 @@ async def test_prompt_handler_stdio(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -727,7 +727,7 @@ async def test_prompt_handler_stdio_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -795,7 +795,7 @@ async def test_prompt_handler_streamable_http(sentry_init, capture_items, json_r
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -868,7 +868,7 @@ async def test_prompt_handler_streamable_http_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -1144,7 +1144,7 @@ async def test_tool_result_extraction_tuple(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -1197,7 +1197,7 @@ async def test_tool_result_extraction_tuple_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -1245,7 +1245,7 @@ async def test_tool_result_extraction_unstructured(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -1296,7 +1296,7 @@ async def test_tool_result_extraction_unstructured_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -1430,7 +1430,7 @@ async def test_prompt_with_dict_result(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
}
Expand Down Expand Up @@ -1485,7 +1485,7 @@ async def test_prompt_with_dict_result_no_sensitive_data(
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": False,
"outputs": False,
}
Expand Down Expand Up @@ -1536,7 +1536,7 @@ async def test_tool_with_complex_arguments(sentry_init, capture_items, stdio):
integrations=[MCPIntegration()],
traces_sample_rate=1.0,
data_collection={
"gen_ai": {
"mcp": {
"inputs": True,
"outputs": True,
},
Expand Down
Loading