agenticdome-python-sdk 1.2.37__tar.gz → 1.2.38__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/PKG-INFO +1 -1
  2. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_python_sdk.egg-info/PKG-INFO +1 -1
  3. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/catalog_snapshot.json +3 -3
  4. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/onboarding_cli.py +98 -7
  5. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/pyproject.toml +1 -1
  6. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/CONTRIBUTING.md +0 -0
  7. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/LICENSE +0 -0
  8. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/MANIFEST.in +0 -0
  9. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/NOTICE +0 -0
  10. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/README.md +0 -0
  11. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/SECURITY.md +0 -0
  12. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_python_sdk.egg-info/SOURCES.txt +0 -0
  13. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_python_sdk.egg-info/dependency_links.txt +0 -0
  14. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_python_sdk.egg-info/entry_points.txt +0 -0
  15. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_python_sdk.egg-info/requires.txt +0 -0
  16. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_python_sdk.egg-info/top_level.txt +0 -0
  17. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/__init__.py +0 -0
  18. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/_framework_firewall.py +0 -0
  19. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/_mode.py +0 -0
  20. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/action_path_proof.py +0 -0
  21. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/agno.py +0 -0
  22. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/attestation.py +0 -0
  23. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/autogen.py +0 -0
  24. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/aws_bedrock.py +0 -0
  25. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/claude.py +0 -0
  26. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/client.py +0 -0
  27. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/connect.py +0 -0
  28. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/copilot_ir.py +0 -0
  29. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/copilot_ir_collector.cjs +0 -0
  30. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/crewai.py +0 -0
  31. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/demo.py +0 -0
  32. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/existing_integration.py +0 -0
  33. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/framework_edits.py +0 -0
  34. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/generic_python.py +0 -0
  35. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/google_adk.py +0 -0
  36. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/guided_integration.py +0 -0
  37. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/hook_catalog.py +0 -0
  38. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/identity.py +0 -0
  39. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/langgraph.py +0 -0
  40. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/lifecycle.py +0 -0
  41. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/llamaindex.py +0 -0
  42. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/mcp_host.py +0 -0
  43. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/mcp_http_gateway.py +0 -0
  44. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/mcp_rehearsal_server.py +0 -0
  45. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/mcp_verification.py +0 -0
  46. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/microsoft_agent_framework.py +0 -0
  47. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/microsoft_ai_foundry.py +0 -0
  48. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/openai_agents.py +0 -0
  49. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/outcomes.py +0 -0
  50. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/proof.py +0 -0
  51. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/pydantic.py +0 -0
  52. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/simulation.py +0 -0
  53. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/agenticdome_sdk/smolagents.py +0 -0
  54. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/customer-onboarding.md +0 -0
  55. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/README.md +0 -0
  56. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/agno.md +0 -0
  57. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/autogen.md +0 -0
  58. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/aws-bedrock.md +0 -0
  59. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/claude-agent-sdk.md +0 -0
  60. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/crewai.md +0 -0
  61. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/custom-python.md +0 -0
  62. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/google-adk.md +0 -0
  63. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/langgraph.md +0 -0
  64. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/llamaindex.md +0 -0
  65. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/microsoft-agent-framework.md +0 -0
  66. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/microsoft-ai-foundry.md +0 -0
  67. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/openai-agents.md +0 -0
  68. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/pydanticai.md +0 -0
  69. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/frameworks/smolagents.md +0 -0
  70. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/mcp-integration.md +0 -0
  71. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/performance-evidence.md +0 -0
  72. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/docs/runtime-deployment.md +0 -0
  73. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/PRODUCTION_INTEGRATION.md +0 -0
  74. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/README.md +0 -0
  75. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/attack_demo.py +0 -0
  76. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/crewai_agenticdome_firewall.py +0 -0
  77. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/README.md +0 -0
  78. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/_shared.py +0 -0
  79. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/agno.py +0 -0
  80. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/autogen.py +0 -0
  81. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/aws_bedrock.py +0 -0
  82. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/claude_agent_sdk.py +0 -0
  83. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/crewai.py +0 -0
  84. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/custom_python.py +0 -0
  85. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/google_adk.py +0 -0
  86. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/langgraph.py +0 -0
  87. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/llamaindex.py +0 -0
  88. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/mcp.py +0 -0
  89. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/microsoft_agent_framework.py +0 -0
  90. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/microsoft_ai_foundry.py +0 -0
  91. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/openai_agents.py +0 -0
  92. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/pydanticai.py +0 -0
  93. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/frameworks/smolagents.py +0 -0
  94. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/langgraph_agenticdome_firewall.py +0 -0
  95. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/local_simulation_gallery.py +0 -0
  96. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/examples/mcp_gateway_action_firewall.py +0 -0
  97. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/setup.cfg +0 -0
  98. {agenticdome_python_sdk-1.2.37 → agenticdome_python_sdk-1.2.38}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agenticdome-python-sdk
3
- Version: 1.2.37
3
+ Version: 1.2.38
4
4
  Summary: Official Python SDK for AgenticDome security guardrails, DLP, tool authorization, and multi-agent delegation enforcement.
5
5
  Author: AgenticDome
6
6
  License-Expression: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agenticdome-python-sdk
3
- Version: 1.2.37
3
+ Version: 1.2.38
4
4
  Summary: Official Python SDK for AgenticDome security guardrails, DLP, tool authorization, and multi-agent delegation enforcement.
5
5
  Author: AgenticDome
6
6
  License-Expression: Apache-2.0
@@ -2,12 +2,12 @@
2
2
  "schema": "agenticdome.catalog-snapshot.v1",
3
3
  "catalog_schema": "agenticdome.hook-catalog.v1",
4
4
  "verified_at": "2026-10-02",
5
- "python_sdk_version": "1.2.37",
5
+ "python_sdk_version": "1.2.38",
6
6
  "published_packages": {
7
7
  "agenticdome-python-sdk": {
8
8
  "registry": "pypi",
9
- "version": "1.2.37",
10
- "url": "https://pypi.org/project/agenticdome-python-sdk/1.2.37/"
9
+ "version": "1.2.38",
10
+ "url": "https://pypi.org/project/agenticdome-python-sdk/1.2.38/"
11
11
  },
12
12
  "agenticdome-sdk": {
13
13
  "registry": "npm",
@@ -7,6 +7,7 @@ paths and boundary locations, never source snippets or file contents.
7
7
  from __future__ import annotations
8
8
 
9
9
  import argparse
10
+ import ast
10
11
  import difflib
11
12
  import hashlib
12
13
  import importlib.metadata
@@ -716,6 +717,82 @@ def _mcp_evidence_id(kind: str, relative: str, line: int) -> str:
716
717
  return f"{kind}-{digest}"
717
718
 
718
719
 
720
+ def _agenticdome_policy_probe_spans(text: str) -> Dict[int, List[Tuple[int, int]]]:
721
+ """Mask only a confirmed AgenticDome policy call's MCP method literal.
722
+
723
+ A policy client can use the MCP JSON-RPC envelope without forwarding
724
+ customer MCP tools. Keep all other MCP calls in the same file visible.
725
+ Unparseable or ambiguous source receives no exception.
726
+ """
727
+ if "tools/call" not in text or "guardrail.validate" not in text:
728
+ return {}
729
+ try:
730
+ module = ast.parse(text)
731
+ except (SyntaxError, ValueError):
732
+ return {}
733
+
734
+ def field(mapping: ast.AST, key: str) -> Optional[ast.AST]:
735
+ if not isinstance(mapping, ast.Dict):
736
+ return None
737
+ return next(
738
+ (value for name, value in zip(mapping.keys, mapping.values)
739
+ if isinstance(name, ast.Constant) and name.value == key),
740
+ None,
741
+ )
742
+
743
+ def is_literal(node: Optional[ast.AST], value: str) -> bool:
744
+ return isinstance(node, ast.Constant) and node.value == value
745
+
746
+ # The legacy urllib client uses an environment-overridable URL whose
747
+ # checked-in default is AgenticDome's own /mcp policy endpoint.
748
+ policy_url_names: set[str] = set()
749
+ for node in ast.walk(module):
750
+ if not isinstance(node, (ast.Assign, ast.AnnAssign)):
751
+ continue
752
+ targets = node.targets if isinstance(node, ast.Assign) else [node.target]
753
+ value = node.value
754
+ if value is None or not any(
755
+ isinstance(part, ast.Constant) and isinstance(part.value, str)
756
+ and re.fullmatch(r"https?://(?:[a-z0-9-]+\.)*agenticdome\.io(?::\d+)?/mcp/?", part.value, re.I)
757
+ for part in ast.walk(value)
758
+ ):
759
+ continue
760
+ policy_url_names.update(target.id for target in targets if isinstance(target, ast.Name))
761
+
762
+ spans: Dict[int, List[Tuple[int, int]]] = {}
763
+ for function in ast.walk(module):
764
+ if not isinstance(function, (ast.FunctionDef, ast.AsyncFunctionDef)):
765
+ continue
766
+ calls = [node for node in ast.walk(function) if isinstance(node, ast.Call)]
767
+ for assignment in ast.walk(function):
768
+ if not isinstance(assignment, (ast.Assign, ast.AnnAssign)):
769
+ continue
770
+ targets = assignment.targets if isinstance(assignment, ast.Assign) else [assignment.target]
771
+ names = {target.id for target in targets if isinstance(target, ast.Name)}
772
+ method = field(assignment.value, "method") if assignment.value is not None else None
773
+ params = field(assignment.value, "params") if assignment.value is not None else None
774
+ if not names or not is_literal(method, "tools/call") or not is_literal(field(params, "name"), "guardrail.validate"):
775
+ continue
776
+
777
+ def sends_policy_payload(call: ast.Call) -> bool:
778
+ if not any(isinstance(part, ast.Name) and part.id in names for part in ast.walk(call)):
779
+ return False
780
+ if (isinstance(call.func, ast.Attribute) and call.func.attr == "_post"
781
+ and call.args and is_literal(call.args[0], "/mcp")):
782
+ return True
783
+ return (
784
+ isinstance(call.func, (ast.Name, ast.Attribute))
785
+ and (call.func.id if isinstance(call.func, ast.Name) else call.func.attr) == "Request"
786
+ and bool(call.args)
787
+ and isinstance(call.args[0], ast.Name)
788
+ and call.args[0].id in policy_url_names
789
+ )
790
+
791
+ if any(sends_policy_payload(call) for call in calls):
792
+ spans.setdefault(method.lineno, []).append((method.col_offset, method.end_col_offset))
793
+ return spans
794
+
795
+
719
796
  def _detect_mcp_protection(root: Path, paths: Sequence[Path], languages: Sequence[str]) -> Dict[str, Any]:
720
797
  """Collect source-free MCP topology and candidate protection evidence.
721
798
 
@@ -735,15 +812,21 @@ def _detect_mcp_protection(root: Path, paths: Sequence[Path], languages: Sequenc
735
812
  for path in paths:
736
813
  relative = _relative(path, root)
737
814
  text = _read_text(path)
738
- # A client asking AgenticDome's own /mcp policy endpoint to run
739
- # guardrail.validate is not a customer MCP forwarder. Do not suggest
740
- # an MCP onboarding path from that protocol-shaped probe alone.
741
- policy_probe_only = (
815
+ python_source = path.suffix.lower() in {".py", ".pyi"}
816
+ policy_probe_spans = _agenticdome_policy_probe_spans(text) if python_source else {}
817
+ # Preserve the existing JavaScript/TypeScript policy-client exception.
818
+ # Unlike Python, this scanner has no AST span for those languages, so
819
+ # exempt only a single policy call with no other MCP integration hints.
820
+ if not python_source and (
742
821
  bool(re.search(r"['\"]name['\"]\s*:\s*['\"]guardrail\.validate['\"]", text))
743
822
  and bool(re.search(r"_post\s*\(\s*['\"]/mcp['\"]", text))
744
- and not re.search(r"\b(?:from\s+mcp|import\s+mcp|FastMCP|McpServer|ClientSession|StdioClientTransport|SSEClientTransport)\b|@modelcontextprotocol", text)
745
- )
746
- if policy_probe_only:
823
+ and len(re.findall(r"\btools/call\b", text)) == 1
824
+ and not re.search(
825
+ r"\b(?:FastMCP|McpServer|MCPClient|McpClient|ClientSession|StdioClientTransport|"
826
+ r"SSEClientTransport|call_tool|callTool|registerTool|tools/list|setRequestHandler)\b|@modelcontextprotocol",
827
+ text,
828
+ )
829
+ ):
747
830
  continue
748
831
  if not re.search(
749
832
  r"(?:\b(?:from\s+mcp|import\s+mcp|FastMCP|MCPClient|McpClient|McpServer|ClientSession|"
@@ -753,6 +836,14 @@ def _detect_mcp_protection(root: Path, paths: Sequence[Path], languages: Sequenc
753
836
  ):
754
837
  continue
755
838
  for line_number, line in enumerate(text.splitlines(), start=1):
839
+ # AST offsets are UTF-8 byte offsets. Mask the exact policy method
840
+ # literal, not the whole line or file: a real MCP call alongside
841
+ # the policy probe must still trigger specialist onboarding.
842
+ if line_number in policy_probe_spans:
843
+ encoded = bytearray(line.encode("utf-8"))
844
+ for start, end in policy_probe_spans[line_number]:
845
+ encoded[start:end] = b" " * (end - start)
846
+ line = encoded.decode("utf-8")
756
847
  for role, patterns in MCP_ROLE_PATTERNS.items():
757
848
  if any(pattern.search(line) for pattern in patterns):
758
849
  roles.add(role)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agenticdome-python-sdk"
7
- version = "1.2.37"
7
+ version = "1.2.38"
8
8
  description = "Official Python SDK for AgenticDome security guardrails, DLP, tool authorization, and multi-agent delegation enforcement."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"