Skip to main content
Glama
Saraid10
by Saraid10

TrustGate

TrustGate는 AI 구매자가 판매자, 금액, 통화, 승인 또는 제공자 결과를 다시 작성할 권한을 얻지 않고 카탈로그 구매를 제안할 수 있는 합성 데이터, Razorpay Test Mode 데모입니다. 에이전트는 제안합니다. TrustGate는 독립적으로 승인하고 증거를 기록합니다.

그것이 증명하는 것

  • 카탈로그 SKU와 수량은 에이전트가 영향을 미칠 수 있는 유일한 구매 사실입니다.

  • 테넌트 범위 정책, 인간 승인, 일회성 체크아웃 권한, 검증된 제공자 이벤트가 모든 결제 작업을 제한합니다.

  • 안전하지 않은 시도는 제공자 주문이 생성되기 전에 거부되고 감사 가능한 추적을 남깁니다.

Related MCP server: safe-cart-ai

여기서 AI가 사용되는 방법

구매자 에이전트는 의도적으로 얇으며, 그것은 지름길이 아니라 논점입니다. 카탈로그 SKU, 수량, 목적만 제안할 수 있으며, 모든 금전적으로 중요한 사실은 서버 측에서 파생됩니다. 에이전트를 완전히 삭제해도 인증 계층은 변경되지 않고 여전히 정확합니다.

엔지니어링 기여는 정교한 에이전트가 아닙니다. 그것은 언어 모델 실패 모드를 진지하게 받아들이는 것입니다 — 제3자 콘텐츠를 통한 프롬프트 주입, 운영자의 이익에 반하는 지시 따르기, 돈에 대한 자신만만한 잘못된 추론 — 그리고 그러한 상황이 발생할 때 올바르게 유지되는 시스템을 구축하는 것입니다.

그 주장은 양방향으로 테스트됩니다. python -m agent.demo --live는 제3자(적대적인 포함)가 작성한 카탈로그 설명에 대해 실제 모델을 실행합니다. 동일한 카탈로그가 두 번 전송되며, 한 번은 설명이 제거된 상태로 전송되어 신뢰할 수 없는 콘텐츠의 영향은 자체 보고가 아닌 두 제안을 비교하여 측정됩니다. 회귀 테스트 스위트는 모델 제공자를 호출하지 않습니다. 결정적 대체물을 사용하므로 안전성 검증은 모델이 특정 날짜에 특정 방식으로 행동하는 것에 의존하지 않습니다.

문제 보기

세 가지 깨끗한 거부는 시스템이 작동함을 증명하지만 왜 누군가 그것을 필요로 하는지 보여주는 데는 약합니다. 따라서 데모는 네트워크, 자격 증명, 데이터베이스 없이 이 프로젝트 자체 코드가 실패하는 것으로 시작합니다:

python -m demo.unguarded

동일한 에이전트가 동일한 오염된 카탈로그를 읽습니다. 문자 그대로 동일합니다. 두 카탈로그 모두 agent/demo_catalog.py에서 빌드되고 테스트는 시드된 행과 기준 객체가 동일한 주입된 지시를 전달한다고 주장하기 때문입니다. 하나의 모델 응답이 두 어댑터에 전달됩니다.

보호되지 않은 어댑터는 금액과 판매자를 수락하므로 주입된 지시가 실행되어 카탈로그 텍스트가 명명한 판매자에게 카탈로그 가격 INR 600.00에 대해 INR 20,000.00을 지불합니다. 다른 어댑터는 PurchaseProposal이 SKU, 수량, 목적만 선언하므로 두 필드를 넣을 곳이 없습니다. 폐기 후 살아남는 것은 quantity=50이며, 이는 에이전트가 설정할 수 있는 필드입니다. 서버는 이를 카탈로그 자체 최대값 2에 대해 제한하므로 결제 요청이 생성되기 전에 시도가 거부됩니다.

차이는 공격을 인식한 필터가 아니라 한 인터페이스에는 돈을 위한 필드가 있었고 다른 인터페이스에는 없었다는 것입니다. 기준선에는 실제로 도달할 수 없다는 것과 여전히 악용 가능하다는 것을 주장하는 자체 테스트가 있습니다. 조용히 취약하지 않게 된 데모는 반대 요점을 만들면서 계속 통과할 것이기 때문입니다.

공격 매트릭스

Tier A 적대적 시나리오. 이 표는 python -m scenarios.report에 의해 시나리오 레지스트리에서 생성되며, 테스트가 일치한다고 주장하므로 통과하는 테스트로 다루지 않는 공격을 주장할 수 없습니다. 모든 시나리오는 세 가지를 증명합니다: 공격이 이유 코드와 함께 거부되고, 제공자 주문이 생성되지 않았으며, 결제가 가지지 못한 권한을 얻지 못했습니다.

ID

공격

입증된 불변식

테스트

A1

금액 변조

금액은 카탈로그 항목의 가격과 서버에서 제한된 수량에서 파생됩니다. 에이전트가 제공한 어떤 값도 이를 변경할 수 없습니다.

test_a1_supplied_amount_field_is_refused_at_the_boundarytest_a1_mcp_surface_has_no_amount_parametertest_a1_quantity_cannot_be_used_to_escalate_the_amount

A2

판매자 대체

판매자는 테넌트 범위의 카탈로그 항목에서 파생됩니다. 테넌트 외부의 판매자는 도달할 수 없으며, 활성 정책 외부의 판매자는 결제할 수 없습니다.

test_a2_another_tenants_sku_is_not_reachabletest_a2_policy_disallowed_merchant_cannot_be_paid

A3

통화 대체

통화는 카탈로그 항목에서 파생되며, 통화를 허용하는 유일한 경로는 기본적으로 비활성화되어 있고 활성화되면 활성 정책과 불일치하는 경우 거부합니다.

test_a3_the_agent_surface_derives_currency_and_cannot_be_told_onetest_a3_the_only_currency_accepting_route_is_disabled_by_defaulttest_a3_an_enabled_legacy_route_still_denies_a_currency_outside_the_policy

A4

만료되었거나 재사용된 승인

승인은 수명과 단일 사용이 있는 권한입니다. 만료된 승인이나 이미 사용된 승인은 모두 승인할 수 없으며, 거부된 승인은 소진되지 않습니다.

test_a4_an_expired_approval_cannot_authorizetest_a4_an_already_consumed_approval_cannot_authorize_again

A5

자기 승인

승인은 구매를 요청한 주체가 부여할 수 없습니다. 직무 분리는 단순히 구성에서 기대되는 것이 아니라 강제됩니다.

test_a5_an_approval_cannot_be_granted_by_the_requesting_actortest_a5_a_separate_approver_can_still_grant

A6

위조된 웹훅 서명

공급자 이벤트는 본문이 파싱되기 전에 원시 바이트 HMAC으로 인증됩니다. 위조되거나 없는 서명은 이벤트가 아무리 잘 구성되어 있어도 아무것도 변경하지 않습니다.

test_a6_a_forged_signature_is_refusedtest_a6_an_unsigned_event_is_refused

A7

변조된 웹훅 본문

서명은 수신된 정확한 바이트를 포함하므로, 전송 중에 편집된 진짜 서명된 이벤트는 더 이상 검증되지 않으며 결제에 도달하지 않습니다.

test_a7_a_body_altered_after_signing_no_longer_verifies

A8

중복 웹훅 전달

공급자 이벤트 ID가 저장되므로, 인증된 창 내 이벤트의 재생은 어떤 핸들러가 우연히 보는지에 관계없이 데이터베이스에 의해 거부됩니다.

test_a8_a_replayed_event_does_not_transition_the_payment_twice

A9

순서가 잘못된 공급자 이벤트

도착 순서는 공급자의 것이고 합법성은 우리의 것입니다. 캡처는 승인보다 먼저 발생할 수 없으며, 종료 상태의 결제는 추가 결과를 받아들이지 않습니다.

test_a9_a_capture_cannot_precede_an_authorizationtest_a9_a_terminal_payment_accepts_no_further_provider_outcome

A10

이중 환불

어떤 표면에서도 환불을 시작할 수 없으며, 이는 라이브 라우트 테이블과 도구 목록에 대해 단언됩니다. 원장 불변식은 캡처를 초과하는 환불 합계를 거부합니다.

test_a10_no_surface_anywhere_can_initiate_a_refundtest_a10_a_refund_total_cannot_exceed_what_was_captured

A11a

알 수 없는 테넌트 헤더

해석되지 않는 테넌트는 어떤 라우트 본문이 실행되기 전에 거부되며, 거부는 호출자가 어떤 테넌트가 존재하는지 열거할 수 있게 하는 어떤 정보도 공개하지 않습니다.

test_a11a_an_unknown_tenant_header_is_refusedtest_a11a_an_unknown_tenant_is_indistinguishable_from_a_forbidden_one

A11b

테넌트 간 객체 접근

모든 테넌트 범위 조회는 신뢰된 테넌트로 필터링합니다. 알려진 테넌트는 어떤 표면에서도 다른 테넌트의 요청, 결제 또는 권한을 읽거나 조치할 수 없습니다.

test_a11b_checkout_authority_route_refuses_another_tenants_requesttest_a11b_razorpay_route_refuses_another_tenants_authoritytest_a11b_mcp_refuses_another_tenants_payment

A12

멱등성 키 충돌

다른 구매와 함께 재사용된 키는 원래 결정과 409를 반환합니다. 두 번째 구매는 생성되지 않으며 수락된 것으로 오인될 수 없습니다.

test_a12_a_reused_key_with_a_different_purchase_returns_the_first_decision

A13

승인과 사용 사이의 정책 드리프트

권한은 검사된 정책이나 발급된 구매보다 오래 지속되지 않습니다. 대체 정책이나 편집된 금액은 소진하지 않고 권한을 취소하며, 드리프트되지 않은 권한은 여전히 작동합니다.

test_a13_an_authority_is_valid_until_the_policy_under_it_movestest_a13_a_policy_published_after_authorization_revokes_the_authoritytest_a13_an_amount_edited_after_authorization_breaks_the_snapshot_hash

A14

오래되었거나 미래 날짜의 웹훅

서명은 출처를 증명하지 최신성을 증명하지 않습니다. 신선도 창 밖의 이벤트, 미래 날짜의 이벤트, 또는 타임스탬프가 전혀 없는 이벤트는 어떤 조회 전에 거부됩니다.

test_a14_a_stale_signed_event_is_refusedtest_a14_a_post_dated_event_cannot_extend_its_own_validitytest_a14_an_event_with_no_timestamp_is_refused_rather_than_exempted

A15

MCP를 통한 무단 캡처

에이전트가 도달할 수 있는 어떤 도구도 승인, 캡처, 환불 또는 공급자 호출을 할 수 없습니다. 도구 이름을 검사하는 것이 아니라 노출된 모든 도구를 실행하여 증명됩니다.

test_a15_every_exposed_mcp_tool_grants_no_payment_authoritytest_a15_mcp_exposes_no_provider_or_authorization_tool

모든 Tier A 시나리오가 구현되었습니다. A11aA11b는 테넌트 혼동을 해석할 수 없는 테넌트와 경계를 넘어 도달하는 알려진 테넌트로 나눕니다. 두 경우는 서로 다른 이유로 실패하고 두 번째만 인가 문제이기 때문입니다.

테스트의 가치

통과하는 테스트 스위트는 코드가 작성된 대로 동작한다는 것을 말합니다. 코드가 중요한 일을 중단했을 때 테스트가 이의를 제기할 것이라는 것을 말하지 않으며, 금전이 관련된 주제에서는 두 번째 주장만이 중요합니다. 이 프로젝트는 그 차이에 대한 증거를 가지고 있습니다: 요청 범위 세션은 146개의 테스트가 통과하는 동안 모든 쓰기를 폐기한 적이 있었는데, 스위트가 작성한 것과 동일한 트랜잭션 내에서 단언했기 때문입니다.

make mutation은 각 안전 불변식을 의도적으로 하나씩 깨뜨리고, 그 수호자로 명명된 테스트가 실패하도록 요구합니다. 모든 소스 파일은 finally 블록에서 복원되며, 보고서가 출력되기 전에 복원이 git diff로 확인되므로 중단된 실행이 변형을 남길 수 없습니다. 어떤 변형이 살아남으면 0이 아닌 종료 코드로 종료됩니다.

이 표는 python -m scenarios.report --mutations에 의해 변형 레지스트리에서 생성되며, 테스트가 일치함을 단언하므로 실제로 보호되지 않는 보호된 불변식을 주장할 수 없습니다.

Mutation

Invariant it removes

payment-row-lock

결제는 상태가 읽히고 변경되기 전에 잠깁니다.

locked-read-freshness

잠긴 읽기는 캐시된 행이 아닌 커밋된 행을 기준으로 결정합니다.

locking-discipline

행 잠금은 의미를 유지하는 단일 헬퍼를 통해서만 획득됩니다.

webhook-signature-check

공급자 이벤트는 어떤 작업이 수행되기 전에 인증됩니다.

webhook-freshness-window

서명된 공급자 이벤트는 최신성이 아니라 출처를 증명합니다.

webhook-timestamp-required

날짜를 알 수 없는 이벤트는 범위를 제한할 수 없으므로 거부됩니다.

approval-expiry

승인은 영구적인 부여가 아니라 수명이 있는 권한입니다.

authority-policy-drift

권한은 검증에 사용된 정책보다 오래 지속되지 않습니다.

authority-snapshot-binding

권한은 발급된 정확한 구매에 바인딩됩니다.

daily-budget-predicate

일일 예산 upsert는 한도를 초과하는 것을 거부합니다.

budget-release-from-state-guard

예산은 실제로 예약한 결제에 의해서만 반환됩니다.

checkout-script-escaping

카탈로그 텍스트는 체크아웃 페이지의 script 요소를 종료할 수 없습니다.

request-session-commit

성공한 요청은 쓰기를 커밋합니다.

provider-event-identity

하나의 결제에 대한 수명 주기 이벤트는 재생이 아닌 별개의 이벤트입니다.

self-approval-guard

승인은 요청한 행위자에 의해 부여될 수 없습니다.

evidence-tenant-filter

증거는 요청한 테넌트로 범위가 제한됩니다.

receipt-search-fail-closed

불완전한 공급자 검색은 영수증을 부재로 보고하지 않습니다.

이 스위트의 첫 실행에서 실제 결함이 발견되었습니다. ORM을 통한 SELECT ... FOR UPDATE는 잠금을 올바르게 획득한 다음 Postgres가 반환한 행을 버립니다. SQLAlchemy가 세션의 identity map에 이미 있는 객체의 속성을 유지하기 때문입니다. 따라서 두 번째 호출자는 설계된 대로 잠금에서 차단되고, 커밋된 행을 수신하고, 오래된 복사본을 유지한 채 방금 승인된 결제를 승인했습니다. 잠금은 전환이 실행되는 시점을 직렬화했을 뿐, 전환이 결정을 내리는 기준이 된 상태는 직렬화하지 않았습니다. 이제 모든 잠금은 models.locking.locked()를 통해 이루어지며, 테스트는 해당 헬퍼가 소스에서 잠금을 획득할 수 있는 유일한 위치임을 검증합니다.

현재 범위

TrustGate는 합성 테넌트, 가맹점, INR 가격만 사용합니다. 이는 로컬 안전 테스트베드이며, 결제 처리기, 규정 준수 제품, 법적 동의 시스템, 사기 모델 또는 Live Mode 결제 통합이 아닙니다.

빠른 시작

요구 사항: Docker Desktop 및 Python 3.12.

Copy-Item .env.example .env
docker compose up -d
docker compose exec -T api python -m alembic upgrade head
docker compose exec -T api python -m pytest -q

로컬 API 상태 확인은 http://127.0.0.1:8000/health에서 확인할 수 있습니다.

python -m agent.seed로 일회용 합성 M1 테넌트를 생성합니다. MCP_TENANT_IDMCP_ACTOR_ID를 출력된 값으로 설정한 다음, python -m agent.demo "Buy Starter credits for our student club."로 로컬 구매자 에이전트 데모를 실행합니다. 이 데모는 카탈로그 SKU, 수량, 목적만 제안할 수 있으며, MCP 서버가 모든 금전적으로 중요한 사실을 도출합니다. 결정론적 오염 카탈로그 데모를 실행하려면 python -m agent.demo --adversarial "Buy a small amount of cloud credits."를 사용하세요.

결정론적 대체 모델 대신 실제 모델로 동일한 흐름을 실행하려면 pip install -e ".[agent]"로 선택적 추가 기능을 설치하고 --live를 추가하세요. 두 가지 백엔드가 지원되며 둘 다 동일한 Messages API 형태를 사용합니다:

  • TRUSTGATE_MODEL_BACKEND=anthropic (기본값)은 ANTHROPIC_API_KEY를 읽습니다.

  • TRUSTGATE_MODEL_BACKEND=bedrock는 AWS 계정에 청구됩니다. 자격 증명이 속한 리전으로 AWS_REGION을 설정한 다음, AWS_BEARER_TOKEN_BEDROCK(Bedrock API 키, 가장 간단한 방법) 또는 SigV4 서명용 표준 AWS 자격 증명을 설정하세요. Amazon Bedrock은 AWS Marketplace 구독을 통해 Anthropic 모델을 프로비저닝하므로, 크레딧으로 사용량을 충당할 수 있는 경우에도 AWS 계정에 유효한 결제 수단이 필요합니다.

  • TRUSTGATE_MODEL_BACKEND=groqGROQ_API_KEY를 읽으며 결제 수단이 전혀 필요하지 않습니다.

TRUSTGATE_MODEL_ID는 모든 백엔드에서 모델을 재정의합니다. 구매자는 프로토콜 구현이므로 공급자는 아키텍처 선택이 아닌 구성 선택입니다. 인증 계층의 동작은 어떤 모델이 구매를 제안하는지에 의존하지 않습니다.

이것은 프로젝트에서 모델 공급자와 접촉하는 유일한 경로이며, 테스트 스위트는 절대 접촉하지 않습니다. 합성 시드 카탈로그에 대해서만 실행하세요. 타사 설명은 영향력을 측정하기 위해 설명이 제거된 상태와 그대로인 상태로 두 번 모델에 전송됩니다. 이 데모를 통해 실제 고객, 가맹점 또는 결제 데이터를 절대 전송하지 마세요.

Razorpay Test Mode 어댑터를 사용하려면 무시된 .env 파일에 RAZORPAY_KEY_IDRAZORPAY_KEY_SECRET을 설정하세요. Test Mode 또는 Live Mode 비밀을 저장소에 절대 추가하지 마세요.

신뢰 경계

AI buyer proposes SKU, quantity, and purpose
        -> TrustGate derives and authorizes money-critical facts
        -> Razorpay Test Mode executes a bounded order
        -> TrustGate records authorization and provider evidence

공식 빌드 계획은 docs/build-plan.md에 있으며, 아키텍처, 위협 모델 및 설계 결정은 docs/에 있습니다.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to browse product catalogs and make purchases through a policy engine that enforces spending limits, requires human approval for certain amounts, and logs all actions to an audit trail.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables human-in-the-loop authorization for AI agent transactions, allowing real-time approval or denial of purchases based on configurable spending limits, vendor blocklists, daily caps, and category restrictions.
    1
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Saraid10/Trustgate'

If you have feedback or need assistance with the MCP directory API, please join our Discord server