ต้นแบบ · รุ่นทดลอง: มีทุก server ในทะเบียนทางการ อัปเดตทุก 30 นาที รีวิวและบัญชีผู้ใช้จะมาในขั้นถัดไป
PopNx MCPที่รวม MCP สำหรับคนใช้ AI · อธิบายเป็นภาษาคน

GxP Gateway Audit

โดย antonio-castellonรุ่น 0.4.0i★ –iรันบนเครื่อง
ชื่อใน registryio.github.antonio-castellon/mcp-glp-audit-proxy

ติดตั้ง

ภาพรวม

คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)

Audits MCP and HTTPS calls. Tamper-evident trail for GLP.

สามเสาของ PopNx MCP

สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน

ใช้ทำอะไรได้

ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry

  • การเชื่อมต่อ: รันบนเครื่อง
  • ช่องทาง (transport): stdio
  • หมวด: อื่น ๆ
  • ต้องใส่ค่าเหล่านี้: GLP_CONFIG, GLP_PRINCIPAL_ID, GLP_PRINCIPAL_NAME, GLP_PRINCIPAL_ROLE

ติดตั้ง

เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง

ก่อนติดตั้ง

ต้องเตรียมก่อน

  • PyPIติดตั้ง uv ของ Python (มีคำสั่ง uvx) ในเครื่อง

คุณใช้แอปไหน

เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”

เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json

{
  "mcpServers": {
    "glp-audit-proxy": {
      "command": "uvx",
      "args": [
        "mcp-glp-audit-proxy"
      ],
      "env": {
        "GLP_CONFIG": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_ID": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_NAME": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_ROLE": "ใส่ค่าของคุณ"
      }
    }
  }
}

พิมพ์คำสั่งนี้ใน Terminal

claude mcp add glp-audit-proxy --env GLP_CONFIG='ใส่ค่าของคุณ' --env GLP_PRINCIPAL_ID='ใส่ค่าของคุณ' --env GLP_PRINCIPAL_NAME='ใส่ค่าของคุณ' --env GLP_PRINCIPAL_ROLE='ใส่ค่าของคุณ' -- uvx mcp-glp-audit-proxy

เติมค่าที่เว้นว่างไว้ก่อนรัน

เปิดใน Cursor

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json

{
  "mcpServers": {
    "glp-audit-proxy": {
      "command": "uvx",
      "args": [
        "mcp-glp-audit-proxy"
      ],
      "env": {
        "GLP_CONFIG": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_ID": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_NAME": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_ROLE": "ใส่ค่าของคุณ"
      }
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

เปิดใน VS Code

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .vscode/mcp.json ของโปรเจกต์

{
  "servers": {
    "glp-audit-proxy": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "mcp-glp-audit-proxy"
      ],
      "env": {
        "GLP_CONFIG": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_ID": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_NAME": "ใส่ค่าของคุณ",
        "GLP_PRINCIPAL_ROLE": "ใส่ค่าของคุณ"
      }
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น

ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี

ค่าที่ต้องใส่เอง

  • GLP_CONFIG จำเป็น env
    Path to the proxy JSON config (upstreams, policy, audit file).
  • GLP_PRINCIPAL_ID จำเป็น env
    Authenticated human id for this process. Stdio identity comes from the environment.
  • GLP_PRINCIPAL_NAME จำเป็น env
    Printed name of the human principal.
  • GLP_PRINCIPAL_ROLE จำเป็น env
    One of operator, approver, qa, admin.

ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README

ทำอะไรได้บ้าง

รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง

ผลตรวจเบื้องต้นi

เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 10 พ.ย. 2569

  • ✓ ผ่าน

    ตัวตนผู้ทำตรงกับ repo

    ชื่อใน registry ยืนยันด้วยบัญชี GitHub antonio-castellon ซึ่งเป็นเจ้าของ repo

  • … ยังไม่ตรวจ

    ยังมีคนดูแล

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • … ยังไม่ตรวจ

    มีสัญญาอนุญาต (license)

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • – ไม่เกี่ยว

    endpoint ตอบ

    ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต

  • – ไม่เกี่ยว

    ล็อกอินแบบ OAuth

    ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน

  • … ยังไม่ตรวจ

    คำอธิบายเครื่องมือไม่มีคำสั่งแอบแฝง

    รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต

เทียบกับตัวอื่นในหมวด อื่น ๆi

  • ดาวมากกว่า 0% ของอีก 19001 ตัวในหมวดนี้
  • ส่งรุ่นใหม่เข้า registry ล่าสุดกว่า 72% ของอีก 19001 ตัวในหมวดนี้
  • ผลตรวจเบื้องต้นดีกว่าหรือเท่ากับ 100% ของอีก 19001 ตัวในหมวดนี้

เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo

คำถามที่พบบ่อย

GxP Gateway Audit ปลอดภัยไหม?

จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น

ต้องใช้กุญแจหรือรหัสอะไรบ้าง?

ต้องใส่ค่าเหล่านี้: GLP_CONFIG, GLP_PRINCIPAL_ID, GLP_PRINCIPAL_NAME, GLP_PRINCIPAL_ROLE

ตัวนี้รันบนเครื่องหรือบนคลาวด์?

รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)

ยังมีคนดูแลอยู่ไหม?

repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.4.0) เข้า registry 16 วันที่ผ่านมา

ใช้กับโปรแกรมไหนได้บ้าง?

โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย

มีตัวไหนใช้แทนได้บ้าง?

ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, paidfor

ตัวที่ใช้แทนได้

server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว

อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi

Spec Driven Development

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

โดย formulahendryเริ่มต้น↓ 66/สัปดาห์★ 440อัปเดต 14 เดือนที่ผ่านมา

รันบนเครื่อง

Remote Desktop Commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

โดย desktop-commanderกำลังโต★ 211อัปเดต วันนี้

รันบนคลาวด์✓ desktopcommander.app

paidfor

Check an x402 seller before paying: verdict, failure rate and evidence from paid calls on Base.

โดย sarmadahsanเริ่มต้น↓ 231/สัปดาห์อัปเดต วันนี้

บนเครื่องหรือคลาวด์✓ paidfor.dev

README จากผู้ทำ

เปิดอ่าน README

ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ

mcp-name: io.github.antonio-castellon/mcp-glp-audit-proxy

mcp-glp-audit-proxy

GxP Gateway Audit (package mcp-glp-audit-proxy) audits MCP and HTTP(S) APIs, gateways, and LLM endpoints. Community edition, v0.4.0. The package name, the command names, and the MCP Registry id stay mcp-glp-audit-proxy. Changes since 0.2.0 are in CHANGELOG.md.

The listener and every remote URL are HTTPS with TLS 1.3. Plain HTTP is refused. With no listen object the process is still the stdio MCP proxy between a host and its MCP servers.

It is designed to support GLP / 21 CFR Part 11 / EU GMP Annex 11 workflows. Data stays on the customer's infrastructure. This package is the open core. Signed checkpoints, WORM storage, PDF/CSV reports, the IQ/OQ pack and SSO/OAuth are Pro features and are not in this repository. Personal Part 11 e-signatures are out of scope. Community is tamper-evident via the hash chain. It is not signed. Signing is Pro.

Install

Requires Python 3.11 or newer.

pip install mcp-glp-audit-proxy

From a checkout:

pip install -e ".[dev]"

The mcp dependency is pinned to >=2.2.0,<3. That floor is outside GHSA-84m7-p3x7-pcfv (affected ranges are mcp >=1.8.0,<1.30.0 and >=2.0.0,<2.2.0). The process refuses to start on an older SDK.

Run

export GLP_PRINCIPAL_ID=operator-1

export GLP_PRINCIPAL_NAME="Ada Analyst" export GLP_PRINCIPAL_ROLE=operator mcp-glp-audit-proxy --config config.json

Stdio identity comes from the environment (GLP_PRINCIPAL_ID, GLP_PRINCIPAL_NAME, GLP_PRINCIPAL_ROLE). When the config has no listen object, the process reads newline-delimited JSON-RPC on stdin and writes it on stdout, and it does not open a socket. When listen is set, the same command serves HTTPS and does not read stdio. A Cursor snippet is in mcp.json. A full config is in config.example.json. The config reference is docs/manual-guides/README.md.

plugins.storage, plugins.signer, plugins.reporters and plugins.auth select entry points. The defaults are jsonl, unsigned, json plus text, and env. env returns the principal from GLP_PRINCIPAL_* or the config file. It is not an identity provider. An unknown plugin, or a plugin whose declared licence feature is not enabled, refuses to start. The factory is not called. The proxy does not fall back to another backend. See docs/PLUGINS.md.

Verify a chain and write a searchable JSON export (the export is skipped when the chain does not verify):

mcp-glp-audit-proxy-verify data/audit.jsonl --json-export exports/audit.json

mcp-glp-audit-proxy-verify data/audit.jsonl --tool excel__write_cell --status ok mcp-glp-audit-proxy-verify data/audit.jsonl --print-head

--print-head prints seq= entry_hash=<64 hex>. Copy that line into a ticket, an email or a LIMS record. Check it later with --expect-head : or --expect-head-file (the file may hold that same line). The command exits 1 when the chain tip differs. The sidecar data/audit.jsonl.head makes a cut of whole trailing lines fail verification. Someone who can edit both the log and the sidecar can move them together; the external copy is the control. Community is tamper-evident via the hash chain. It is not signed. Signing is Pro. --pubkey passes a pinned public key file to the licensed signer plugin. With no licensed signer the check fails. Pass --licence and --client-id, or set GLP_LICENCE_PATH and GLP_CLIENT_ID, to load that signer. With no licence path, no licence file is read. A missing or invalid licence exits 2. Unsigned checkpoints stay the default and are not treated as signed. The log and the .head sidecar are mode 0600 on open. A log directory created by the store is mode 0700.

Configure

init asks for the audit log path, the tool allow list, the principal (id, name, role), and the retention profile and legal hold. It writes a JSON config the same loader as startup accepts, with mode 0600. Prompts and the file are ASCII. The wizard does not open a network connection. If the destination already exists, it is left unchanged unless you answer yes to the overwrite question.

mcp-glp-audit-proxy init

mcp-glp-audit-proxy init /srv/glp/config.json

The default path is GLP_CONFIG when that variable is set, otherwise config.json. That is the same file the proxy reads.

config check loads a config and prints a plain-language error when it does not load. The process exits 0 when the file loads and 1 when it does not. It uses the same loader as startup, including the GLP_* overrides. The default path matches init.

mcp-glp-audit-proxy config check

mcp-glp-audit-proxy config check config.json

A licensed plugin can add questions and a validation step through the mcp_glp_audit_proxy.wizard entry point. An unlicensed plugin is not called and adds nothing. See docs/PLUGINS.md.

A licence file is local. There is no network call. LM1 is three lines: LM1, base64 of the body, and base64 of an RSA-2048 PSS signature over those raw bytes. LM2 is three lines: LM2, base64 of the body, and base64 of a 64-byte Ed25519 signature over those raw bytes, and the body must be compact sorted JSON. LM1, and LM2 with no features list, enable the features declared by the installed licensed plugins. An LM2 file that lists features enables only the listed names. Any other file is rejected. The production public keys are in release_trust.json and are loaded by trusted_keys() in mcp_glp_audit_proxy.trust. The fingerprint is not a machine id. Details are in docs/PLUGINS.md.

What is recorded

Every mediated call, including denials and failures, is one JSON object on an append-only JSONL file. Each line is RFC 8785 canonical JSON. entry_hash is the SHA-256 of that object with entry_hash removed. prev_hash is the previous entry (64 zero digits for the first). hash_algo and canonicalization are stored on the entry. The open schema is schema/audit-record.schema.json. Cross-language vectors are in schema/jcs-test-vectors.json.

Fields include who (principal id, name, role), which tool, inputs, outputs, UTC timestamp plus utc_offset, protocol version, optional session id, record class (gxp_data, access, technical, config), reason for writes, and the previous hash.

Schema 1.3.0 stores transport (stdio or https), channel (mcp or https), flow (mcp2mcp, mcp2api, api2mcp, api2api, mcp2llm, api2llm, or null on local records), http, arguments_sha256, and result_sha256. The http object holds the method, the route template, the path with the query string removed, the kept headers, the names of stripped credential headers, the body SHA-256, body_mode, the stored body, the status, latency_ms, and kind (api, llm, or mcp). The query string is forwarded and is not stored. 1.0.0 and 1.1.0 lines omit the later keys. 1.2.0 lines omit the two SHA-256 fields. Older lines stay valid in the same chain.

The GxP trail is that file. The Python logging logger mcp_glp_audit_proxy.technical writes method, status and record class to stderr. It is not the record. Arguments are not written there.

Policy

  • Allow list and deny list use shell-style globs on the exposed tool name (excel__write_cell). Deny wins. An empty allow list denies every upstream tool.
  • Roles are operator, approver, qa and admin. Only operator may call upstream tools. qa is read-only on the trail (glp_verify_chain, glp_search_audit, glp_export_audit). approver may record an approval and read the trail. admin may change policy and read the trail, and cannot call upstream tools.
  • Auditing cannot be switched off. glp_update_policy with audit_enabled: false is denied and logged.
  • Write tools (names matching write_tools) require a reason by default. The reason is _meta["io.github.antonio-castellon/reason"] or the argument _glp_reason (stripped before the upstream call).
  • Optional human approval holds the write until a different person in the approver role records meaning approved. reviewed is stored with status reviewed and does not authorise the write. A log written before schema 1.1.0 may show that decision as status approved with meaning reviewed; those lines still verify and still do not authorise the write. rejected rejects it. An approval is single-use, bound to the SHA-256 of the canonical {tool, arguments}, and expires (default 3600 seconds). A successful write that presents a matching approval records it as consumed even if require_approval_for_writes was turned off before that call. A failed upstream call does not consume it. The record label is approval. It is not an electronic signature.
  • HTTP routes use a second pair of lists, http_allow and http_deny. Each entry is METHOD /path with a shell-style glob on the path (GET /v1/studies/*). Deny wins. An empty http_allow denies every HTTPS route. It does not deny MCP tool calls. Only operator may call an HTTPS route.
  • audit.body_mode is hash_only (the default for a new config), redacted, or full. Which value to use is the customer's and QA's decision. body_mode applies to HTTPS bodies and to MCP tool-call arguments and results. The SHA-256 of the raw request body is always recorded, and the SHA-256 of MCP tool arguments and results is recorded the same way. hash_only stores no body bytes and no MCP payload. redacted stores JSON with the paths in audit.redact_paths replaced by *** (a non-JSON body stores no plaintext). full stores the parsed JSON, or the UTF-8 text, of the request inside the hash-chained record, and full also stores the response text as response_body next to response_sha256. The log file is mode 0600. Binary that is not UTF-8 is hashed and not stored as the request body. The response body is returned to the client in every mode. A write request without Content-Length, or with Transfer-Encoding, is refused with 411 and logged. In hash_only and redacted modes the trail proves that a payload existed and was unaltered, but does not show its content; the content record must be kept by the target system (OECD N

ตัดมาแค่ช่วงต้น อ่านต่อใน repo

ถาม PopNx