diff --git a/capiscio_sdk/_rpc/client.py b/capiscio_sdk/_rpc/client.py index b7135b3..21e8dc3 100644 --- a/capiscio_sdk/_rpc/client.py +++ b/capiscio_sdk/_rpc/client.py @@ -7,16 +7,30 @@ from capiscio_sdk._rpc.process import ProcessManager, get_process_manager -# Import generated stubs +# Import generated stubs (eagerly loaded — used by core flows) from capiscio_sdk._rpc.gen.capiscio.v1 import badge_pb2, badge_pb2_grpc from capiscio_sdk._rpc.gen.capiscio.v1 import did_pb2, did_pb2_grpc -from capiscio_sdk._rpc.gen.capiscio.v1 import mcp_pb2, mcp_pb2_grpc from capiscio_sdk._rpc.gen.capiscio.v1 import trust_pb2, trust_pb2_grpc from capiscio_sdk._rpc.gen.capiscio.v1 import revocation_pb2, revocation_pb2_grpc from capiscio_sdk._rpc.gen.capiscio.v1 import scoring_pb2, scoring_pb2_grpc from capiscio_sdk._rpc.gen.capiscio.v1 import simpleguard_pb2, simpleguard_pb2_grpc from capiscio_sdk._rpc.gen.capiscio.v1 import registry_pb2, registry_pb2_grpc +# MCP protos are lazy-loaded to avoid descriptor pool conflicts when +# capiscio-mcp registers its own copy of capiscio/v1/mcp.proto in the +# same process (e.g. demo scripts that import both SDK and MCP). +mcp_pb2 = None +mcp_pb2_grpc = None + + +def _ensure_mcp_protos(): + global mcp_pb2, mcp_pb2_grpc + if mcp_pb2 is None: + from capiscio_sdk._rpc.gen.capiscio.v1 import mcp_pb2 as _mcp_pb2 + from capiscio_sdk._rpc.gen.capiscio.v1 import mcp_pb2_grpc as _mcp_pb2_grpc + mcp_pb2 = _mcp_pb2 + mcp_pb2_grpc = _mcp_pb2_grpc + class CapiscioRPCClient: """High-level gRPC client for capiscio-core. @@ -110,7 +124,7 @@ def connect(self, timeout: float = 10.0) -> "CapiscioRPCClient": # Initialize stubs self._badge_stub = badge_pb2_grpc.BadgeServiceStub(self._channel) self._did_stub = did_pb2_grpc.DIDServiceStub(self._channel) - self._mcp_stub = mcp_pb2_grpc.MCPServiceStub(self._channel) + self._mcp_stub = None # Lazy-loaded via mcp property (uses _ensure_mcp_protos()) self._trust_stub = trust_pb2_grpc.TrustStoreServiceStub(self._channel) self._revocation_stub = revocation_pb2_grpc.RevocationServiceStub(self._channel) self._scoring_stub = scoring_pb2_grpc.ScoringServiceStub(self._channel) @@ -120,7 +134,7 @@ def connect(self, timeout: float = 10.0) -> "CapiscioRPCClient": # Initialize service wrappers self._badge = BadgeClient(self._badge_stub) self._did = DIDClient(self._did_stub) - self._mcp = MCPClient(self._mcp_stub) + self._mcp = None # Lazy-loaded via mcp property self._trust = TrustStoreClient(self._trust_stub) self._revocation = RevocationClient(self._revocation_stub) self._scoring = ScoringClient(self._scoring_stub) @@ -173,7 +187,10 @@ def did(self) -> "DIDClient": def mcp(self) -> "MCPClient": """Access the MCPService (RFC-006 / RFC-007).""" self._ensure_connected() - assert self._mcp is not None + if self._mcp is None: + _ensure_mcp_protos() + self._mcp_stub = mcp_pb2_grpc.MCPServiceStub(self._channel) + self._mcp = MCPClient(self._mcp_stub) return self._mcp @property @@ -1365,7 +1382,7 @@ class MCPClient: ) """ - def __init__(self, stub: mcp_pb2_grpc.MCPServiceStub) -> None: + def __init__(self, stub) -> None: self._stub = stub def evaluate_tool_access( diff --git a/capiscio_sdk/_rpc/gen/capiscio/v1/mcp_pb2.py b/capiscio_sdk/_rpc/gen/capiscio/v1/mcp_pb2.py index 43a2684..3a89650 100644 --- a/capiscio_sdk/_rpc/gen/capiscio/v1/mcp_pb2.py +++ b/capiscio_sdk/_rpc/gen/capiscio/v1/mcp_pb2.py @@ -25,7 +25,25 @@ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x63\x61piscio/v1/mcp.proto\x12\x0b\x63\x61piscio.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"\xa9\x02\n\x19\x45valuateToolAccessRequest\x12\x1b\n\ttool_name\x18\x01 \x01(\tR\x08toolName\x12\x1f\n\x0bparams_hash\x18\x02 \x01(\tR\nparamsHash\x12#\n\rserver_origin\x18\x03 \x01(\tR\x0cserverOrigin\x12\x1d\n\tbadge_jws\x18\x04 \x01(\tH\x00R\x08\x62\x61\x64geJws\x12\x19\n\x07\x61pi_key\x18\x05 \x01(\tH\x00R\x06\x61piKey\x12%\n\x0epolicy_version\x18\x06 \x01(\tR\rpolicyVersion\x12\x33\n\x06\x63onfig\x18\x07 \x01(\x0b\x32\x1b.capiscio.v1.EvaluateConfigR\x06\x63onfigB\x13\n\x11\x63\x61ller_credential\"\xb2\x01\n\x0e\x45valuateConfig\x12\'\n\x0ftrusted_issuers\x18\x01 \x03(\tR\x0etrustedIssuers\x12&\n\x0fmin_trust_level\x18\x02 \x01(\x05R\rminTrustLevel\x12*\n\x11\x61\x63\x63\x65pt_level_zero\x18\x03 \x01(\x08R\x0f\x61\x63\x63\x65ptLevelZero\x12#\n\rallowed_tools\x18\x04 \x03(\tR\x0c\x61llowedTools\"\xc5\x03\n\x1a\x45valuateToolAccessResponse\x12\x34\n\x08\x64\x65\x63ision\x18\x01 \x01(\x0e\x32\x18.capiscio.v1.MCPDecisionR\x08\x64\x65\x63ision\x12;\n\x0b\x64\x65ny_reason\x18\x02 \x01(\x0e\x32\x1a.capiscio.v1.MCPDenyReasonR\ndenyReason\x12\x1f\n\x0b\x64\x65ny_detail\x18\x03 \x01(\tR\ndenyDetail\x12\x1b\n\tagent_did\x18\x04 \x01(\tR\x08\x61gentDid\x12\x1b\n\tbadge_jti\x18\x05 \x01(\tR\x08\x62\x61\x64geJti\x12\x38\n\nauth_level\x18\x06 \x01(\x0e\x32\x19.capiscio.v1.MCPAuthLevelR\tauthLevel\x12\x1f\n\x0btrust_level\x18\x07 \x01(\x05R\ntrustLevel\x12#\n\revidence_json\x18\x08 \x01(\tR\x0c\x65videnceJson\x12\x1f\n\x0b\x65vidence_id\x18\t \x01(\tR\nevidenceId\x12\x38\n\ttimestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimestamp\"\xe5\x01\n\x1bVerifyServerIdentityRequest\x12\x1d\n\nserver_did\x18\x01 \x01(\tR\tserverDid\x12!\n\x0cserver_badge\x18\x02 \x01(\tR\x0bserverBadge\x12)\n\x10transport_origin\x18\x03 \x01(\tR\x0ftransportOrigin\x12#\n\rendpoint_path\x18\x04 \x01(\tR\x0c\x65ndpointPath\x12\x34\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1c.capiscio.v1.MCPVerifyConfigR\x06\x63onfig\"\xe1\x01\n\x0fMCPVerifyConfig\x12\'\n\x0ftrusted_issuers\x18\x01 \x03(\tR\x0etrustedIssuers\x12&\n\x0fmin_trust_level\x18\x02 \x01(\x05R\rminTrustLevel\x12*\n\x11\x61\x63\x63\x65pt_level_zero\x18\x03 \x01(\x08R\x0f\x61\x63\x63\x65ptLevelZero\x12!\n\x0coffline_mode\x18\x04 \x01(\x08R\x0bofflineMode\x12.\n\x13skip_origin_binding\x18\x05 \x01(\x08R\x11skipOriginBinding\"\x91\x02\n\x1cVerifyServerIdentityResponse\x12\x31\n\x05state\x18\x01 \x01(\x0e\x32\x1b.capiscio.v1.MCPServerStateR\x05state\x12\x1f\n\x0btrust_level\x18\x02 \x01(\x05R\ntrustLevel\x12\x1d\n\nserver_did\x18\x03 \x01(\tR\tserverDid\x12\x1b\n\tbadge_jti\x18\x04 \x01(\tR\x08\x62\x61\x64geJti\x12>\n\nerror_code\x18\x05 \x01(\x0e\x32\x1f.capiscio.v1.MCPServerErrorCodeR\terrorCode\x12!\n\x0c\x65rror_detail\x18\x06 \x01(\tR\x0b\x65rrorDetail\"\xaa\x01\n\x1aParseServerIdentityRequest\x12@\n\x0chttp_headers\x18\x01 \x01(\x0b\x32\x1b.capiscio.v1.MCPHttpHeadersH\x00R\x0bhttpHeaders\x12@\n\x0cjsonrpc_meta\x18\x02 \x01(\x0b\x32\x1b.capiscio.v1.MCPJsonRpcMetaH\x00R\x0bjsonrpcMetaB\x08\n\x06source\"t\n\x0eMCPHttpHeaders\x12.\n\x13\x63\x61piscio_server_did\x18\x01 \x01(\tR\x11\x63\x61piscioServerDid\x12\x32\n\x15\x63\x61piscio_server_badge\x18\x02 \x01(\tR\x13\x63\x61piscioServerBadge\"-\n\x0eMCPJsonRpcMeta\x12\x1b\n\tmeta_json\x18\x01 \x01(\tR\x08metaJson\"\x8a\x01\n\x1bParseServerIdentityResponse\x12\x1d\n\nserver_did\x18\x01 \x01(\tR\tserverDid\x12!\n\x0cserver_badge\x18\x02 \x01(\tR\x0bserverBadge\x12)\n\x10identity_present\x18\x03 \x01(\x08R\x0fidentityPresent\"9\n\x10MCPHealthRequest\x12%\n\x0e\x63lient_version\x18\x01 \x01(\tR\rclientVersion\"\xa4\x01\n\x11MCPHealthResponse\x12\x18\n\x07healthy\x18\x01 \x01(\x08R\x07healthy\x12!\n\x0c\x63ore_version\x18\x02 \x01(\tR\x0b\x63oreVersion\x12#\n\rproto_version\x18\x03 \x01(\tR\x0cprotoVersion\x12-\n\x12version_compatible\x18\x04 \x01(\x08R\x11versionCompatible*Z\n\x0bMCPDecision\x12\x1c\n\x18MCP_DECISION_UNSPECIFIED\x10\x00\x12\x16\n\x12MCP_DECISION_ALLOW\x10\x01\x12\x15\n\x11MCP_DECISION_DENY\x10\x02*\x82\x01\n\x0cMCPAuthLevel\x12\x1e\n\x1aMCP_AUTH_LEVEL_UNSPECIFIED\x10\x00\x12\x1c\n\x18MCP_AUTH_LEVEL_ANONYMOUS\x10\x01\x12\x1a\n\x16MCP_AUTH_LEVEL_API_KEY\x10\x02\x12\x18\n\x14MCP_AUTH_LEVEL_BADGE\x10\x03*\xd3\x02\n\rMCPDenyReason\x12\x1f\n\x1bMCP_DENY_REASON_UNSPECIFIED\x10\x00\x12!\n\x1dMCP_DENY_REASON_BADGE_MISSING\x10\x01\x12!\n\x1dMCP_DENY_REASON_BADGE_INVALID\x10\x02\x12!\n\x1dMCP_DENY_REASON_BADGE_EXPIRED\x10\x03\x12!\n\x1dMCP_DENY_REASON_BADGE_REVOKED\x10\x04\x12&\n\"MCP_DENY_REASON_TRUST_INSUFFICIENT\x10\x05\x12$\n MCP_DENY_REASON_TOOL_NOT_ALLOWED\x10\x06\x12$\n MCP_DENY_REASON_ISSUER_UNTRUSTED\x10\x07\x12!\n\x1dMCP_DENY_REASON_POLICY_DENIED\x10\x08*\xac\x01\n\x0eMCPServerState\x12 \n\x1cMCP_SERVER_STATE_UNSPECIFIED\x10\x00\x12\'\n#MCP_SERVER_STATE_VERIFIED_PRINCIPAL\x10\x01\x12\'\n#MCP_SERVER_STATE_DECLARED_PRINCIPAL\x10\x02\x12&\n\"MCP_SERVER_STATE_UNVERIFIED_ORIGIN\x10\x03*\xd7\x02\n\x12MCPServerErrorCode\x12\x19\n\x15MCP_SERVER_ERROR_NONE\x10\x00\x12 \n\x1cMCP_SERVER_ERROR_DID_INVALID\x10\x01\x12\"\n\x1eMCP_SERVER_ERROR_BADGE_INVALID\x10\x02\x12\"\n\x1eMCP_SERVER_ERROR_BADGE_EXPIRED\x10\x03\x12\"\n\x1eMCP_SERVER_ERROR_BADGE_REVOKED\x10\x04\x12\'\n#MCP_SERVER_ERROR_TRUST_INSUFFICIENT\x10\x05\x12$\n MCP_SERVER_ERROR_ORIGIN_MISMATCH\x10\x06\x12\"\n\x1eMCP_SERVER_ERROR_PATH_MISMATCH\x10\x07\x12%\n!MCP_SERVER_ERROR_ISSUER_UNTRUSTED\x10\x08\x32\x93\x03\n\nMCPService\x12\x65\n\x12\x45valuateToolAccess\x12&.capiscio.v1.EvaluateToolAccessRequest\x1a\'.capiscio.v1.EvaluateToolAccessResponse\x12k\n\x14VerifyServerIdentity\x12(.capiscio.v1.VerifyServerIdentityRequest\x1a).capiscio.v1.VerifyServerIdentityResponse\x12h\n\x13ParseServerIdentity\x12\'.capiscio.v1.ParseServerIdentityRequest\x1a(.capiscio.v1.ParseServerIdentityResponse\x12G\n\x06Health\x12\x1d.capiscio.v1.MCPHealthRequest\x1a\x1e.capiscio.v1.MCPHealthResponseB\xae\x01\n\x0f\x63om.capiscio.v1B\x08McpProtoP\x01ZDgithub.com/capiscio/capiscio-core/pkg/rpc/gen/capiscio/v1;capisciov1\xa2\x02\x03\x43XX\xaa\x02\x0b\x43\x61piscio.V1\xca\x02\x0b\x43\x61piscio\\V1\xe2\x02\x17\x43\x61piscio\\V1\\GPBMetadata\xea\x02\x0c\x43\x61piscio::V1b\x06proto3') +try: + DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x63\x61piscio/v1/mcp.proto\x12\x0b\x63\x61piscio.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"\xa9\x02\n\x19\x45valuateToolAccessRequest\x12\x1b\n\ttool_name\x18\x01 \x01(\tR\x08toolName\x12\x1f\n\x0bparams_hash\x18\x02 \x01(\tR\nparamsHash\x12#\n\rserver_origin\x18\x03 \x01(\tR\x0cserverOrigin\x12\x1d\n\tbadge_jws\x18\x04 \x01(\tH\x00R\x08\x62\x61\x64geJws\x12\x19\n\x07\x61pi_key\x18\x05 \x01(\tH\x00R\x06\x61piKey\x12%\n\x0epolicy_version\x18\x06 \x01(\tR\rpolicyVersion\x12\x33\n\x06\x63onfig\x18\x07 \x01(\x0b\x32\x1b.capiscio.v1.EvaluateConfigR\x06\x63onfigB\x13\n\x11\x63\x61ller_credential\"\xb2\x01\n\x0e\x45valuateConfig\x12\'\n\x0ftrusted_issuers\x18\x01 \x03(\tR\x0etrustedIssuers\x12&\n\x0fmin_trust_level\x18\x02 \x01(\x05R\rminTrustLevel\x12*\n\x11\x61\x63\x63\x65pt_level_zero\x18\x03 \x01(\x08R\x0f\x61\x63\x63\x65ptLevelZero\x12#\n\rallowed_tools\x18\x04 \x03(\tR\x0c\x61llowedTools\"\xc5\x03\n\x1a\x45valuateToolAccessResponse\x12\x34\n\x08\x64\x65\x63ision\x18\x01 \x01(\x0e\x32\x18.capiscio.v1.MCPDecisionR\x08\x64\x65\x63ision\x12;\n\x0b\x64\x65ny_reason\x18\x02 \x01(\x0e\x32\x1a.capiscio.v1.MCPDenyReasonR\ndenyReason\x12\x1f\n\x0b\x64\x65ny_detail\x18\x03 \x01(\tR\ndenyDetail\x12\x1b\n\tagent_did\x18\x04 \x01(\tR\x08\x61gentDid\x12\x1b\n\tbadge_jti\x18\x05 \x01(\tR\x08\x62\x61\x64geJti\x12\x38\n\nauth_level\x18\x06 \x01(\x0e\x32\x19.capiscio.v1.MCPAuthLevelR\tauthLevel\x12\x1f\n\x0btrust_level\x18\x07 \x01(\x05R\ntrustLevel\x12#\n\revidence_json\x18\x08 \x01(\tR\x0c\x65videnceJson\x12\x1f\n\x0b\x65vidence_id\x18\t \x01(\tR\nevidenceId\x12\x38\n\ttimestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimestamp\"\xe5\x01\n\x1bVerifyServerIdentityRequest\x12\x1d\n\nserver_did\x18\x01 \x01(\tR\tserverDid\x12!\n\x0cserver_badge\x18\x02 \x01(\tR\x0bserverBadge\x12)\n\x10transport_origin\x18\x03 \x01(\tR\x0ftransportOrigin\x12#\n\rendpoint_path\x18\x04 \x01(\tR\x0c\x65ndpointPath\x12\x34\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1c.capiscio.v1.MCPVerifyConfigR\x06\x63onfig\"\xe1\x01\n\x0fMCPVerifyConfig\x12\'\n\x0ftrusted_issuers\x18\x01 \x03(\tR\x0etrustedIssuers\x12&\n\x0fmin_trust_level\x18\x02 \x01(\x05R\rminTrustLevel\x12*\n\x11\x61\x63\x63\x65pt_level_zero\x18\x03 \x01(\x08R\x0f\x61\x63\x63\x65ptLevelZero\x12!\n\x0coffline_mode\x18\x04 \x01(\x08R\x0bofflineMode\x12.\n\x13skip_origin_binding\x18\x05 \x01(\x08R\x11skipOriginBinding\"\x91\x02\n\x1cVerifyServerIdentityResponse\x12\x31\n\x05state\x18\x01 \x01(\x0e\x32\x1b.capiscio.v1.MCPServerStateR\x05state\x12\x1f\n\x0btrust_level\x18\x02 \x01(\x05R\ntrustLevel\x12\x1d\n\nserver_did\x18\x03 \x01(\tR\tserverDid\x12\x1b\n\tbadge_jti\x18\x04 \x01(\tR\x08\x62\x61\x64geJti\x12>\n\nerror_code\x18\x05 \x01(\x0e\x32\x1f.capiscio.v1.MCPServerErrorCodeR\terrorCode\x12!\n\x0c\x65rror_detail\x18\x06 \x01(\tR\x0b\x65rrorDetail\"\xaa\x01\n\x1aParseServerIdentityRequest\x12@\n\x0chttp_headers\x18\x01 \x01(\x0b\x32\x1b.capiscio.v1.MCPHttpHeadersH\x00R\x0bhttpHeaders\x12@\n\x0cjsonrpc_meta\x18\x02 \x01(\x0b\x32\x1b.capiscio.v1.MCPJsonRpcMetaH\x00R\x0bjsonrpcMetaB\x08\n\x06source\"t\n\x0eMCPHttpHeaders\x12.\n\x13\x63\x61piscio_server_did\x18\x01 \x01(\tR\x11\x63\x61piscioServerDid\x12\x32\n\x15\x63\x61piscio_server_badge\x18\x02 \x01(\tR\x13\x63\x61piscioServerBadge\"-\n\x0eMCPJsonRpcMeta\x12\x1b\n\tmeta_json\x18\x01 \x01(\tR\x08metaJson\"\x8a\x01\n\x1bParseServerIdentityResponse\x12\x1d\n\nserver_did\x18\x01 \x01(\tR\tserverDid\x12!\n\x0cserver_badge\x18\x02 \x01(\tR\x0bserverBadge\x12)\n\x10identity_present\x18\x03 \x01(\x08R\x0fidentityPresent\"9\n\x10MCPHealthRequest\x12%\n\x0e\x63lient_version\x18\x01 \x01(\tR\rclientVersion\"\xa4\x01\n\x11MCPHealthResponse\x12\x18\n\x07healthy\x18\x01 \x01(\x08R\x07healthy\x12!\n\x0c\x63ore_version\x18\x02 \x01(\tR\x0b\x63oreVersion\x12#\n\rproto_version\x18\x03 \x01(\tR\x0cprotoVersion\x12-\n\x12version_compatible\x18\x04 \x01(\x08R\x11versionCompatible*Z\n\x0bMCPDecision\x12\x1c\n\x18MCP_DECISION_UNSPECIFIED\x10\x00\x12\x16\n\x12MCP_DECISION_ALLOW\x10\x01\x12\x15\n\x11MCP_DECISION_DENY\x10\x02*\x82\x01\n\x0cMCPAuthLevel\x12\x1e\n\x1aMCP_AUTH_LEVEL_UNSPECIFIED\x10\x00\x12\x1c\n\x18MCP_AUTH_LEVEL_ANONYMOUS\x10\x01\x12\x1a\n\x16MCP_AUTH_LEVEL_API_KEY\x10\x02\x12\x18\n\x14MCP_AUTH_LEVEL_BADGE\x10\x03*\xd3\x02\n\rMCPDenyReason\x12\x1f\n\x1bMCP_DENY_REASON_UNSPECIFIED\x10\x00\x12!\n\x1dMCP_DENY_REASON_BADGE_MISSING\x10\x01\x12!\n\x1dMCP_DENY_REASON_BADGE_INVALID\x10\x02\x12!\n\x1dMCP_DENY_REASON_BADGE_EXPIRED\x10\x03\x12!\n\x1dMCP_DENY_REASON_BADGE_REVOKED\x10\x04\x12&\n\"MCP_DENY_REASON_TRUST_INSUFFICIENT\x10\x05\x12$\n MCP_DENY_REASON_TOOL_NOT_ALLOWED\x10\x06\x12$\n MCP_DENY_REASON_ISSUER_UNTRUSTED\x10\x07\x12!\n\x1dMCP_DENY_REASON_POLICY_DENIED\x10\x08*\xac\x01\n\x0eMCPServerState\x12 \n\x1cMCP_SERVER_STATE_UNSPECIFIED\x10\x00\x12\'\n#MCP_SERVER_STATE_VERIFIED_PRINCIPAL\x10\x01\x12\'\n#MCP_SERVER_STATE_DECLARED_PRINCIPAL\x10\x02\x12&\n\"MCP_SERVER_STATE_UNVERIFIED_ORIGIN\x10\x03*\xd7\x02\n\x12MCPServerErrorCode\x12\x19\n\x15MCP_SERVER_ERROR_NONE\x10\x00\x12 \n\x1cMCP_SERVER_ERROR_DID_INVALID\x10\x01\x12\"\n\x1eMCP_SERVER_ERROR_BADGE_INVALID\x10\x02\x12\"\n\x1eMCP_SERVER_ERROR_BADGE_EXPIRED\x10\x03\x12\"\n\x1eMCP_SERVER_ERROR_BADGE_REVOKED\x10\x04\x12\'\n#MCP_SERVER_ERROR_TRUST_INSUFFICIENT\x10\x05\x12$\n MCP_SERVER_ERROR_ORIGIN_MISMATCH\x10\x06\x12\"\n\x1eMCP_SERVER_ERROR_PATH_MISMATCH\x10\x07\x12%\n!MCP_SERVER_ERROR_ISSUER_UNTRUSTED\x10\x08\x32\x93\x03\n\nMCPService\x12\x65\n\x12\x45valuateToolAccess\x12&.capiscio.v1.EvaluateToolAccessRequest\x1a\'.capiscio.v1.EvaluateToolAccessResponse\x12k\n\x14VerifyServerIdentity\x12(.capiscio.v1.VerifyServerIdentityRequest\x1a).capiscio.v1.VerifyServerIdentityResponse\x12h\n\x13ParseServerIdentity\x12\'.capiscio.v1.ParseServerIdentityRequest\x1a(.capiscio.v1.ParseServerIdentityResponse\x12G\n\x06Health\x12\x1d.capiscio.v1.MCPHealthRequest\x1a\x1e.capiscio.v1.MCPHealthResponseB\xae\x01\n\x0f\x63om.capiscio.v1B\x08McpProtoP\x01ZDgithub.com/capiscio/capiscio-core/pkg/rpc/gen/capiscio/v1;capisciov1\xa2\x02\x03\x43XX\xaa\x02\x0b\x43\x61piscio.V1\xca\x02\x0b\x43\x61piscio\\V1\xe2\x02\x17\x43\x61piscio\\V1\\GPBMetadata\xea\x02\x0c\x43\x61piscio::V1b\x06proto3') +except TypeError as e: + # Proto already registered by another package (e.g. capiscio_mcp). + # Only fall back for the known duplicate-file-name collision case. + if 'duplicate file name' not in str(e): + raise + pool = _descriptor_pool.Default() + file_descriptor = pool.FindFileByName('capiscio/v1/mcp.proto') + # Validate the existing descriptor is schema-compatible + try: + pool.FindMessageTypeByName('capiscio.v1.EvaluateToolAccessRequest') + except KeyError as lookup_err: + raise RuntimeError( + "An incompatible descriptor for 'capiscio/v1/mcp.proto' is already " + "registered in the default descriptor pool: expected message " + "'capiscio.v1.EvaluateToolAccessRequest' not found." + ) from lookup_err + DESCRIPTOR = file_descriptor _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) diff --git a/pyproject.toml b/pyproject.toml index 0dbd896..24f642d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,6 +67,12 @@ Issues = "https://github.com/capiscio/capiscio-sdk-python/issues" [tool.hatch.build.targets.wheel] packages = ["capiscio_sdk"] +[tool.hatch.build.targets.wheel.force-include] +"capiscio_sdk/_rpc/gen/capiscio" = "capiscio_sdk/_rpc/gen/capiscio" + +[tool.hatch.build.targets.sdist.force-include] +"capiscio_sdk/_rpc/gen/capiscio" = "capiscio_sdk/_rpc/gen/capiscio" + [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"]