Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
OAuth 2.1/OIDC resource-server reference for secure MCP authorization
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
MCP_SERVER_RESOURCE_SERVER_URL, MCP_SERVER_AUTH_PROVIDER, MCP_SERVER_REQUIRED_SCOPES, MCP_SERVER_TRANSPORT_ALLOWED_HOSTS, MCP_SERVER_ENTRA_TENANT_ID, MCP_SERVER_ENTRA_AUDIENCE, MCP_SERVER_ENTRA_APPLICATION_ID_URI, MCP_SERVER_GENERIC_ISSUER_URL, MCP_SERVER_GENERIC_AUDIENCE, MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINSต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"auth-template": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_SERVER_RESOURCE_SERVER_URL",
"-e",
"MCP_SERVER_AUTH_PROVIDER",
"-e",
"MCP_SERVER_REQUIRED_SCOPES",
"-e",
"MCP_SERVER_TRANSPORT_ALLOWED_HOSTS",
"-e",
"MCP_SERVER_ENTRA_TENANT_ID",
"-e",
"MCP_SERVER_ENTRA_AUDIENCE",
"-e",
"MCP_SERVER_ENTRA_APPLICATION_ID_URI",
"-e",
"MCP_SERVER_GENERIC_ISSUER_URL",
"-e",
"MCP_SERVER_GENERIC_AUDIENCE",
"-e",
"MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS",
"ghcr.io/brunovicco/mcp-server-auth-template:v0.7.0"
],
"env": {
"MCP_SERVER_RESOURCE_SERVER_URL": "ใส่ค่าของคุณ",
"MCP_SERVER_AUTH_PROVIDER": "ใส่ค่าของคุณ",
"MCP_SERVER_REQUIRED_SCOPES": "ใส่ค่าของคุณ",
"MCP_SERVER_TRANSPORT_ALLOWED_HOSTS": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_TENANT_ID": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_AUDIENCE": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_APPLICATION_ID_URI": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_ISSUER_URL": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_AUDIENCE": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add auth-template --env MCP_SERVER_RESOURCE_SERVER_URL='ใส่ค่าของคุณ' --env MCP_SERVER_AUTH_PROVIDER='ใส่ค่าของคุณ' --env MCP_SERVER_REQUIRED_SCOPES='ใส่ค่าของคุณ' --env MCP_SERVER_TRANSPORT_ALLOWED_HOSTS='ใส่ค่าของคุณ' --env MCP_SERVER_ENTRA_TENANT_ID='ใส่ค่าของคุณ' --env MCP_SERVER_ENTRA_AUDIENCE='ใส่ค่าของคุณ' --env MCP_SERVER_ENTRA_APPLICATION_ID_URI='ใส่ค่าของคุณ' --env MCP_SERVER_GENERIC_ISSUER_URL='ใส่ค่าของคุณ' --env MCP_SERVER_GENERIC_AUDIENCE='ใส่ค่าของคุณ' --env MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS='ใส่ค่าของคุณ' -- docker run -i --rm -e MCP_SERVER_RESOURCE_SERVER_URL -e MCP_SERVER_AUTH_PROVIDER -e MCP_SERVER_REQUIRED_SCOPES -e MCP_SERVER_TRANSPORT_ALLOWED_HOSTS -e MCP_SERVER_ENTRA_TENANT_ID -e MCP_SERVER_ENTRA_AUDIENCE -e MCP_SERVER_ENTRA_APPLICATION_ID_URI -e MCP_SERVER_GENERIC_ISSUER_URL -e MCP_SERVER_GENERIC_AUDIENCE -e MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS ghcr.io/brunovicco/mcp-server-auth-template:v0.7.0เติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"auth-template": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_SERVER_RESOURCE_SERVER_URL",
"-e",
"MCP_SERVER_AUTH_PROVIDER",
"-e",
"MCP_SERVER_REQUIRED_SCOPES",
"-e",
"MCP_SERVER_TRANSPORT_ALLOWED_HOSTS",
"-e",
"MCP_SERVER_ENTRA_TENANT_ID",
"-e",
"MCP_SERVER_ENTRA_AUDIENCE",
"-e",
"MCP_SERVER_ENTRA_APPLICATION_ID_URI",
"-e",
"MCP_SERVER_GENERIC_ISSUER_URL",
"-e",
"MCP_SERVER_GENERIC_AUDIENCE",
"-e",
"MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS",
"ghcr.io/brunovicco/mcp-server-auth-template:v0.7.0"
],
"env": {
"MCP_SERVER_RESOURCE_SERVER_URL": "ใส่ค่าของคุณ",
"MCP_SERVER_AUTH_PROVIDER": "ใส่ค่าของคุณ",
"MCP_SERVER_REQUIRED_SCOPES": "ใส่ค่าของคุณ",
"MCP_SERVER_TRANSPORT_ALLOWED_HOSTS": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_TENANT_ID": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_AUDIENCE": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_APPLICATION_ID_URI": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_ISSUER_URL": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_AUDIENCE": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"auth-template": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_SERVER_RESOURCE_SERVER_URL",
"-e",
"MCP_SERVER_AUTH_PROVIDER",
"-e",
"MCP_SERVER_REQUIRED_SCOPES",
"-e",
"MCP_SERVER_TRANSPORT_ALLOWED_HOSTS",
"-e",
"MCP_SERVER_ENTRA_TENANT_ID",
"-e",
"MCP_SERVER_ENTRA_AUDIENCE",
"-e",
"MCP_SERVER_ENTRA_APPLICATION_ID_URI",
"-e",
"MCP_SERVER_GENERIC_ISSUER_URL",
"-e",
"MCP_SERVER_GENERIC_AUDIENCE",
"-e",
"MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS",
"ghcr.io/brunovicco/mcp-server-auth-template:v0.7.0"
],
"env": {
"MCP_SERVER_RESOURCE_SERVER_URL": "ใส่ค่าของคุณ",
"MCP_SERVER_AUTH_PROVIDER": "ใส่ค่าของคุณ",
"MCP_SERVER_REQUIRED_SCOPES": "ใส่ค่าของคุณ",
"MCP_SERVER_TRANSPORT_ALLOWED_HOSTS": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_TENANT_ID": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_AUDIENCE": "ใส่ค่าของคุณ",
"MCP_SERVER_ENTRA_APPLICATION_ID_URI": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_ISSUER_URL": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_AUDIENCE": "ใส่ค่าของคุณ",
"MCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
MCP_SERVER_REQUIRED_SCOPES envMCP_SERVER_TRANSPORT_ALLOWED_HOSTS envMCP_SERVER_ENTRA_TENANT_ID envMCP_SERVER_ENTRA_AUDIENCE envMCP_SERVER_ENTRA_APPLICATION_ID_URI envMCP_SERVER_GENERIC_ISSUER_URL envMCP_SERVER_GENERIC_AUDIENCE envMCP_SERVER_GENERIC_JWKS_ALLOWED_ORIGINS envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub brunovicco ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: MCP_SERVER_RESOURCE_SERVER_URL, MCP_SERVER_AUTH_PROVIDER
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.7.0) เข้า registry เดือนที่แล้ว
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Docker ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Zendesk
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Zendesk MCP Pack — tickets, users, organizations via OAuth.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
*Leia em português*
A production-oriented OAuth 2.1 resource-server reference for remote MCP: Microsoft Entra ID and
generic OIDC, exact token/resource validation, fail-closed authorization, progressive scope
challenges, stateless MCP
2026-07-28, and metadata-only OpenTelemetry evidence.
Use this repository when the hard part is not "how do I expose an MCP tool?" but how do I expose it without weakening identity, authorization, transport, and observability boundaries. The server pairs with mcp-client-auth-template for an executable end-to-end reference using synthetic identities and no production credentials.
The paired executable path validates real resource-server behavior rather than configuration claims:
403 insufficient_scope is returned before dispatch for progressive authorization401, with an explicit token-resource policy that does not depend on MCP SDK defaultstools/list is filtered per principal and carries only bounded private cache hints2026-07-28 stays stateless and does not mint Mcp-Session-IdFor a requirement-by-requirement view of the paired OAuth/MCP behavior, including explicit evidence gaps and discussion topics for the MCP Authorization Interest Group / Tool Scopes Working Group, see the Authorization Implementer Report.
flowchart LR
Client["MCP client"] -->|"OAuth 2.1 / OIDC"| AS["Authorization server Entra ID or generic OIDC"] Client -->|"MCP 2026-07-28 resource-bound bearer"| Admission["Transport admission"] Admission --> AuthN["Token verification"] AuthN --> AuthZ["Tool authorization"] AuthZ --> Tools["MCP tools"] Server["This resource server"] --- Admission
Server -->|"OIDC discovery + cached JWKS"| AS Server -.->|"W3C trace context + OTLP"| Collector["OpenTelemetry Collector"] Collector --> Tempo["Tempo"] Tempo --> Grafana["Grafana"]
The authorization server owns login, consent, client registration and token issuance. This repository owns the protected resource: transport admission, metadata publication, access-token verification, request-scoped principal construction, tool authorization and dispatch.
For layer boundaries and the detailed authorization sequence, see Architecture.
The companion client owns the executable cross-repository reference flow. With both repositories cloned as siblings, verify this server directly from source:
cd ../mcp-client-auth-template
./scripts/run_reference_demo.sh \ --server-root ../mcp-server-auth-template
The flow starts the real server from this checkout plus a deterministic local OIDC provider and proves CIMD-first Authorization Code + PKCE, authenticated whoami, bounded scope step-up, wrong-audience rejection and stateless MCP behavior.
For the observable published-image proof:
cd ../mcp-client-auth-template
./scripts/run_observability_demo.sh --keep
The observable flow verifies one distributed trace across client and server, positive Collector receipt, Tempo retrieval, Grafana provisioning and telemetry privacy assertions.
See Verification guide for the exact evidence boundary.
The terminal proof below is captured from the source-level paired reference flow:
The trace screenshots are captured from a successful observable run and focus on mcp-server-auth-template spans:
| Profile | Intended use | Key behavior |
|---|---|---|
| Entra delegated | Interactive enterprise users | Validates scp, tenant/application identifiers, issuer, audience and subject |
| Entra application | Provider-specific app-only deployments | Requires explicit idtyp=app; keeps roles separate from delegated scopes |
| Generic OIDC delegated | Standards-based interactive clients | Validates issuer/audience/signature/expiry and OAuth scopes |
| Generic OIDC client credentials | Unattended services in the deterministic pair profile | Accepts pre-registered machine tokens and progressive OAuth scopes |
Set MCP_SERVER_AUTH_PROVIDER=entra or generic to switch adapters. The example whoami tool returns the verified caller identity; health requires the additional mcp:tools:health scope and demonstrates a pre-dispatch 403 insufficient_scope challenge.
Prerequisites: Python 3.13 or 3.14 and uv.
git clone https://github.com/brunovicco/mcp-server-auth-template.git
cd mcp-server-auth-template cp .env.example .env uv sync --frozen --all-groups uv run uvicorn mcp_server_auth_template.entrypoints.mcp_server:create_app --factory --reload
Configure either the Entra or generic-OIDC block in .env, then point an MCP client at http://localhost:8000/mcp.
| Endpoint | Purpose | Authentication |
|---|---|---|
/mcp | MCP Streamable HTTP | Bearer token |
/.well-known/oauth-protected-resource | Authorization-server discovery metadata | Public |
/livez | Process liveness | Public, minimal response |
/readyz | MCP lifespan readiness | Public, minimal response |
For production-style execution:
uv run python -m mcp_server_auth_template.entrypoints.serve
See Production operations before exposing the service outside loopback.
The server is published in the Official MCP Registry as:
io.github.brunovicco/mcp-server-auth-template@0.7.0
server.json describes the public GHCR image as an OCI package using the real streamable-http transport; it does not claim a hosted remotes endpoint. Publication is gated by the secure release pipeline and a dedicated Registry workflow that validates the immutable image, ownership metadata, and persisted Registry responses before publication.
See Official MCP Registry and the Authorization Implementer Report.
The implementation is deliberately fail closed:
validate_token_resource=False policy: provider audiences (Entra API client ID, api:// identifiers) are enforced by the token verifier, never by SDK URL string equality (ADR-0027);This is a transparent reference implementation, not a security certification. Read Privacy and data handling and the architecture decisions under docs/adr/ before adapting the boundary.
2026-07-28Baseline: MCP specification 2026-07-28 and MCP Python SDK >=2.2,<3.
The paired templates exercise the modern stateless profile as executable behavior:
server/discover and per-request _meta carry protocol version, client identity and capabilities without the legacy initialize / initialized handshake;MCP-Protocol-Version, Mcp-Method and Mcp-Name;Mcp-Session-Id;resource binds the access token audience exactly;server/discover and tools/list carry SEP-2549 cache hints (ttlMs=30000, cacheScope=private);403 insufficient_scope preserves prior grants and permits only one bounded replay of the undispatched operation;io.modelcontextprotocol/oauth-client-credentials.See Compatibility and the companion client's cross-repository E2E evidence.
a2a-otel-kit continues W3C trace context at the MCP ASGI boundary. Export remains network-silent unless A2A_OTEL_ENABLED=true and a complete OTLP traces endpoint are configured. Spans are metadata-only and sit inside hardened HTTP admission but outside authentication and tool dispatch.
See LLM and application observability.
| Reference evidence | Production adoption |
|---|---|
| Synthetic local OIDC in companion demo | Enterprise authorization server with reviewed registration and consent |
| Loopback/local reference networking | TLS-protected servic
ตัดมาแค่ช่วงต้น อ่านต่อใน repo