Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
167 commits
Select commit Hold shift + click to select a range
c599ecd
ci: support passphrase-protected AUR keys
yurirocha15 Jul 18, 2026
b8d135d
feat: add secure randomness and serialized transport writer helpers
yurirocha15 Aug 16, 2026
f374b59
refactor: move implementation out of oversized headers into translati…
yurirocha15 Aug 16, 2026
8a6a99d
test: update suites for the compiled runtime split
yurirocha15 Aug 16, 2026
110d830
feat: add official MCP conformance harness pinned to runner 0.1.16
yurirocha15 Aug 16, 2026
6298429
ci: add conformance workflow, labels, and issue templates
yurirocha15 Aug 16, 2026
b13ac11
feat: extend benchmark harness with audited tooling and published res…
yurirocha15 Aug 16, 2026
d26179b
docs: add tier policy docs, refresh guides, and changelog
yurirocha15 Aug 16, 2026
3e0b052
feat: accept any JSON value in structuredContent
yurirocha15 Aug 16, 2026
b0f428b
feat: add spec-reserved JSON-RPC error code constants
yurirocha15 Aug 16, 2026
c6940ca
test: cover resource not-found code and tools/list ordering
yurirocha15 Aug 16, 2026
4d80f2c
feat: add extensions field to capability structs
yurirocha15 Aug 16, 2026
3eb1442
feat: parse extended OAuth server metadata fields
yurirocha15 Aug 16, 2026
d9a2900
chore: add informational alpha conformance runner
yurirocha15 Aug 16, 2026
bca57ac
ci: add conformance guard checks
yurirocha15 Aug 16, 2026
a034cfb
feat: add OAuth challenge parsing and secure metadata discovery
yurirocha15 Aug 16, 2026
e6411c1
feat: add OAuth client identity selection and conformance auth wiring
yurirocha15 Aug 16, 2026
66f299c
docs: add OAuth security guide
yurirocha15 Aug 16, 2026
adb4b26
test: add token endpoint secret placement assertions
yurirocha15 Aug 16, 2026
5c0e3e7
feat: add OAuth scope step-up and issuer binding checks
yurirocha15 Aug 16, 2026
03c50db
test: drive scope step-up scenario through a tool call
yurirocha15 Aug 16, 2026
fb99241
feat: add discoverable protocol version set for 2026-07-28
yurirocha15 Aug 16, 2026
58abb76
fix(test): close lost-wakeup race in memory transport concurrent-clos…
yurirocha15 Aug 16, 2026
f4b3b65
fix: sanitize peer response bodies in diagnostic messages
yurirocha15 Aug 16, 2026
d8c04b8
fix: canonicalize origins before allow and deny checks
yurirocha15 Sep 13, 2026
bf7a6b7
fix: validate protected resource metadata resource against server url
yurirocha15 Sep 13, 2026
f14cc09
fix: default oauth http client to deny-all fetch policy
yurirocha15 Sep 13, 2026
0fa5199
fix: cancel in-flight authorization on transport close
yurirocha15 Sep 13, 2026
3a4c402
fix: harden origin canonicalization against port and host spoofing
yurirocha15 Sep 13, 2026
371d3c8
test: cover close during discovery, token exchange, and coalescing
yurirocha15 Sep 13, 2026
4633dc1
test: prove token exchange never replays after ambiguous failure
yurirocha15 Sep 13, 2026
8d52940
chore: make conformance runner executable
yurirocha15 Sep 20, 2026
219e9db
feat: add server discover pre-gate method
yurirocha15 Sep 20, 2026
adecd80
fix: tighten protected resource metadata validation
yurirocha15 Sep 20, 2026
e3b53c6
docs: note oauth validation behavior changes
yurirocha15 Sep 20, 2026
65393a3
fix: make server discover reachable over http and emit caching hints
yurirocha15 Sep 20, 2026
a9fbbbd
fix: close single-flight authorization safely across threads
yurirocha15 Sep 20, 2026
5fa3efd
fix: reject unidentified protected resource before contacting auth se…
yurirocha15 Sep 20, 2026
25b85e9
fix: keep server discover reachable once a session exists
yurirocha15 Sep 20, 2026
bdb2449
fix: stop malformed deny list entries from silently allowing an origin
yurirocha15 Sep 20, 2026
a433e8c
fix: require an id for the sessionless discover session-gate exemption
yurirocha15 Sep 20, 2026
d115e4e
fix: keep sessionless discover responses out of the replay event store
yurirocha15 Sep 20, 2026
3976d88
fix: bind injected client credentials to their authorization server
yurirocha15 Sep 20, 2026
a880e66
docs: record the injected credential issuer binding requirement
yurirocha15 Sep 20, 2026
8981d72
test: fix leaked ScriptedTransport in roots sender test
yurirocha15 Sep 20, 2026
410d29b
fix(examples): install a metadata fetch policy in the OAuth flow example
yurirocha15 Sep 20, 2026
987c8fa
test: fix leaked ScriptedTransport in context logging tests
yurirocha15 Sep 20, 2026
7f0f769
docs: avoid the GCC coroutine ICE in the README minimal client
yurirocha15 Sep 20, 2026
b6ca773
docs: correct the prompt handler argument shape in the prompts guide
yurirocha15 Sep 20, 2026
c77a396
ci: compile the README snippets so they cannot rot
yurirocha15 Sep 20, 2026
53f8000
chore: re-enable leak detection in the sanitizer build
yurirocha15 Sep 20, 2026
9f901f5
fix: serialize single-flight timer access on a strand
yurirocha15 Sep 20, 2026
86f38ce
fix: stop an aborted redirect chain and defer the closed-challenge throw
yurirocha15 Sep 20, 2026
feb0f6c
fix(examples): keep stdio diagnostics off the JSON-RPC stdout channel
yurirocha15 Sep 20, 2026
1eb9fd6
docs: document the GCC coroutine initializer-list crash and fix snippets
yurirocha15 Sep 20, 2026
8363a8b
ci: assert the stdio examples keep stdout free of non-protocol output
yurirocha15 Sep 20, 2026
37c82c9
fix: do not cache a protected resource document that fails validation
yurirocha15 Sep 20, 2026
399fffa
docs: record the GCC 12/13 initializer-list ICE with the GCC 11 known…
yurirocha15 Sep 20, 2026
43a4517
fix: carry a flight's outcome and failure on the flight itself
yurirocha15 Sep 20, 2026
c57a1d1
fix: name the issuer field that applies when refusing injected creden…
yurirocha15 Sep 20, 2026
be6c2e9
fix(examples): drive the OAuth example through OAuthAuthorizationManager
yurirocha15 Sep 20, 2026
156a28e
docs: document OAuthAuthorizationManager as the supported authorizati…
yurirocha15 Sep 20, 2026
866cf09
fix: sanitize peer-controlled text in auth diagnostics
yurirocha15 Sep 20, 2026
f046018
docs: anchor the manager-driven OAuth flow into the security guide
yurirocha15 Sep 20, 2026
c9721f8
fix: scope an authenticator's abort to itself instead of the shared c…
yurirocha15 Sep 20, 2026
56ce4ab
fix: keep sanitized diagnostics well-formed UTF-8
yurirocha15 Sep 20, 2026
59998de
test: execute the shipped client against the shipped server's bearer …
yurirocha15 Sep 20, 2026
e992539
fix: synchronize the OAuth HTTP client setters and pin them per exchange
yurirocha15 Sep 20, 2026
18fbf47
test: assert what the client does when the server's challenge names n…
yurirocha15 Sep 20, 2026
563ded9
docs: fix OAuth example index and add TLS caveat pointer
yurirocha15 Sep 20, 2026
98ee502
fix: sanitize peer-named text at the remaining auth throw sites
yurirocha15 Sep 20, 2026
e4ade29
fix: flatten bidirectional overrides that reverse a diagnostic line
yurirocha15 Sep 20, 2026
3dbcd60
fix: refuse a null HTTP client in OAuthAuthenticator instead of fault…
yurirocha15 Sep 20, 2026
ff1db3d
fix: give each OAuth scope its own abort latch
yurirocha15 Sep 20, 2026
4751b78
docs: scope the sanitizer comment to this file and name its obligation
yurirocha15 Sep 20, 2026
4317da8
fix: install the OAuth fetch policy and host resolver as one indivisi…
yurirocha15 Sep 20, 2026
fc0e6d2
fix: flatten and bound peer-chosen text in the client and server diag…
yurirocha15 Sep 20, 2026
5a3d591
fix: flatten and bound the peer's JSON-RPC error message in both diag…
yurirocha15 Sep 20, 2026
73b4daa
fix: flatten U+061C in peer-controlled diagnostic text
yurirocha15 Sep 20, 2026
fd22582
docs: replace the scope-id wording the latch rewrite made false
yurirocha15 Sep 20, 2026
ddc528c
test: fail instead of skipping the setter-pair suite on twin loopback
yurirocha15 Sep 20, 2026
aa7ff8c
test: sample the scope-latch peak while an exchange is in flight
yurirocha15 Sep 20, 2026
98c7cd8
docs: correct the latch-count claim two reviewers took on trust
yurirocha15 Sep 20, 2026
99e793d
docs: say latch objects, not scopes, and name the case that separates…
yurirocha15 Sep 20, 2026
e45f4ca
ci: allow the workflows to be dispatched manually on a branch
yurirocha15 Sep 20, 2026
9d3d012
fix(transport): pin the HTTP client bearer provider per request
yurirocha15 Sep 20, 2026
4e4d0aa
feat(stdio): add an opt-in transport that owns the process stdout
yurirocha15 Sep 20, 2026
2683263
fix(transport): carry sessionless discover under a sentinel request id
yurirocha15 Sep 20, 2026
c162306
docs: record why a scoped pending map is worse than rewriting the id
yurirocha15 Sep 20, 2026
1d159dc
test: assert the internal request id never appears in a peer-visible …
yurirocha15 Sep 20, 2026
38fa0e5
docs: drop session narrative and internal tracking labels from comments
yurirocha15 Sep 20, 2026
ac39c58
docs: state comments in the present tense and drop the remaining narr…
yurirocha15 Sep 20, 2026
375891d
fix(protocol): read a present-but-null optional field as absent
yurirocha15 Sep 20, 2026
0959435
fix(client): drop an undecodable message instead of the session
yurirocha15 Sep 20, 2026
20aab23
fix(server): bound resource URIs and reject adjacent template express…
yurirocha15 Sep 20, 2026
8c30fba
fix(server): pass an already-valid CallToolResult through unwrapped
yurirocha15 Sep 20, 2026
a59ff62
fix(server): treat a null notification params as absent
yurirocha15 Sep 20, 2026
a201b27
fix(server): run middleware outside the tool handler's exception guard
yurirocha15 Sep 20, 2026
854a693
fix(server): unregister the session when teardown fails
yurirocha15 Sep 20, 2026
3e7b9e0
fix(server): treat a null error member as absent on the wire
yurirocha15 Sep 20, 2026
c889b7c
fix(transport): hoist cross-executor dispatch out of a lambda for GCC 11
yurirocha15 Sep 20, 2026
eeb1b7b
build: compile the test target with /bigobj on MSVC
yurirocha15 Sep 20, 2026
1e798ad
fix(scripts): keep sysroot and stdlib flags when compiling README sni…
yurirocha15 Sep 20, 2026
f8c3ca2
test(transport): raise the websocket cancellation watchdog above test…
yurirocha15 Sep 20, 2026
c276b50
fix(transport): bound HTTP request bodies with a configurable, docume…
yurirocha15 Sep 20, 2026
a5d3ed1
docs(transport): fix the session manager usage example so it compiles
yurirocha15 Sep 20, 2026
ae81bcb
feat(transport): serve the OAuth bearer challenge and RFC 9728 metadata
yurirocha15 Sep 20, 2026
8233d6b
docs(oauth): document the server-side challenge, validators and exemp…
yurirocha15 Sep 20, 2026
bd4ac56
test(auth): enable the client-server pairing test for the challenge API
yurirocha15 Sep 20, 2026
41777d8
fix(client): read a null error member as no error
yurirocha15 Sep 20, 2026
1746ac3
test: cover Server destruction from every executor state
yurirocha15 Sep 20, 2026
9f3c864
fix: keep session teardown on the session strand
yurirocha15 Sep 20, 2026
4bb792c
test: collect stdio server output under a mutex
yurirocha15 Sep 20, 2026
3a18fee
test: record why the stdio signal shutdown test has no assertion
yurirocha15 Sep 20, 2026
4ef850a
refactor: drop the unused non-wire request handlers
yurirocha15 Sep 20, 2026
b36e5fd
refactor: hold the server implementation by shared_ptr
yurirocha15 Sep 20, 2026
57ab2b8
refactor: root the request dispatch chain in the server implementation
yurirocha15 Sep 20, 2026
64263d7
fix: report a destroyed server to in-flight handlers
yurirocha15 Sep 20, 2026
5a8b433
test: cover a reverse request issued after the server is destroyed
yurirocha15 Sep 20, 2026
9ecc4bb
docs: record the coroutine frame and forwarder lifetime hazards
yurirocha15 Sep 20, 2026
49aa52a
docs: fix documentation stranded by the dispatch re-rooting
yurirocha15 Sep 27, 2026
68a0764
fix(server): convert non-std exceptions from tool handlers to tool er…
yurirocha15 Sep 27, 2026
bf2c073
docs: record that the send_request forwarder depends on a non-corouti…
yurirocha15 Sep 27, 2026
d2404b3
test: census peer-JSON deserialization and generate an input matrix
yurirocha15 Sep 20, 2026
9f665e4
test: scope the rediscovery gate by component, check error/result asy…
yurirocha15 Sep 20, 2026
608b850
test: recognise key-implicit null guards and invert the gate for fixe…
yurirocha15 Sep 20, 2026
182f52e
fix(transport): reject a protected-resource path without a leading slash
yurirocha15 Sep 27, 2026
d149403
build: refuse a sanitizer build that would silently be unsanitized
yurirocha15 Sep 27, 2026
6367323
docs(oauth): name the protected-resource metadata helpers in the guide
yurirocha15 Sep 27, 2026
aad3195
docs(oauth): render the example challenge through the server-side API
yurirocha15 Sep 27, 2026
3981c72
docs(client): document the 30-second default request timeout
yurirocha15 Sep 27, 2026
b43161f
test(transport): cover origin checking on both HTTP server transports
yurirocha15 Sep 27, 2026
19ac73a
docs(oauth): document the exported bearer and request-path helpers
yurirocha15 Sep 27, 2026
3099fce
docs: add changelog entries for the OAuth challenge and server hardening
yurirocha15 Sep 27, 2026
b0f8c72
fix: accept explicit null in server-reachable request params
yurirocha15 Sep 27, 2026
59bea4a
fix: accept explicit null in optional protocol type members
yurirocha15 Sep 27, 2026
1ad462e
fix: accept explicit null in initialize and completion params
yurirocha15 Sep 27, 2026
1491038
fix: treat explicit null _meta and annotations as absent
yurirocha15 Sep 27, 2026
fbe7c7b
test: regenerate the peer-input matrix for the explicit-null fixes
yurirocha15 Sep 27, 2026
1ac9dd2
fix: treat explicit null _meta in tools/call params as absent
yurirocha15 Sep 27, 2026
002e8f0
docs: record the explicit-null decoding fixes in the changelog
yurirocha15 Sep 27, 2026
adfd1bb
test: record what the peer-input matrix can and cannot prove
yurirocha15 Sep 27, 2026
e9b1645
test: correct the field-entry denominator in the matrix caveat
yurirocha15 Sep 27, 2026
c9aa367
build: skip the matrix check when its scripts are not shipped
yurirocha15 Oct 1, 2026
e0218d5
refactor: split peer-input matrix generation into render and write
yurirocha15 Oct 1, 2026
bee0749
fix: fail the build when the peer-input matrix is stale
yurirocha15 Oct 1, 2026
01cc5df
fix: refuse to regenerate a matrix row that regressed to throwing
yurirocha15 Oct 1, 2026
2b39d64
test: cover the peer-input matrix staleness check and ratchet
yurirocha15 Oct 1, 2026
a3e5b93
ci: run the matrix check unit tests in the policy job
yurirocha15 Oct 1, 2026
d88202b
docs: record the peer-input matrix build check in the changelog
yurirocha15 Oct 1, 2026
9bdca3a
fix: check matrix regressions against HEAD as well as the working tree
yurirocha15 Oct 1, 2026
ac39802
fix: re-check the OAuth abort latch before opening a connection
yurirocha15 Oct 5, 2026
f7ac163
test: wait for the stalled fetch before closing from another thread
yurirocha15 Oct 1, 2026
e318b83
docs: record the OAuth lost-close fix in the changelog
yurirocha15 Oct 5, 2026
855a00a
test: move the getaddrinfo resolve gate into shared test support
yurirocha15 Oct 5, 2026
7a9386b
fix: re-check the HTTP client closed flag before opening a connection
yurirocha15 Oct 5, 2026
c27f7af
fix: re-check the WebSocket client closed flag before connecting
yurirocha15 Oct 5, 2026
0050c48
test: make ClientCloseDeletesSentToServer observe the session DELETE
yurirocha15 Oct 5, 2026
0744a0a
fix: close the in-flight HTTP socket on close instead of cancelling once
yurirocha15 Oct 5, 2026
aea15a6
docs: record the transport lost-close fixes in the changelog
yurirocha15 Oct 5, 2026
e3b1830
fix: run OAuth HTTP exchanges on the client's strand
yurirocha15 Oct 5, 2026
e62faa0
docs: record the OAuth strand fix in the changelog
yurirocha15 Oct 5, 2026
ef2daa3
fix: report operation_aborted for an HTTP write cut short by close
yurirocha15 Oct 5, 2026
106f6b5
docs: state the error a closed HTTP client write reports
yurirocha15 Oct 5, 2026
acef82a
docs: tighten close entries and drop unused test includes
yurirocha15 Oct 5, 2026
852db94
style: use /// only for declaration docs and // elsewhere
yurirocha15 Oct 5, 2026
5148cfe
docs: trim over-long comments
yurirocha15 Oct 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Bug report
description: Report incorrect SDK behavior or interoperability
title: "[Bug]: "
body:
- type: markdown
attributes:
value: |
For a security vulnerability, stop here and use the private process in SECURITY.md.
- type: textarea
id: summary
attributes:
label: Summary
description: What happened, and what did you expect instead?
validations:
required: true
- type: input
id: sdk-version
attributes:
label: SDK version or commit
placeholder: v0.2.0 or a full commit SHA
validations:
required: true
- type: input
id: protocol-version
attributes:
label: MCP protocol revision
placeholder: "2025-11-25"
validations:
required: true
- type: textarea
id: environment
attributes:
label: Environment
description: OS, compiler and version, build type, transport, and dependency versions.
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Minimal reproduction
description: Include the smallest source, build command, and request sequence that reproduces the issue.
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs or wire messages
description: Remove credentials, tokens, personal data, and other secrets.
render: text
- type: checkboxes
id: checks
attributes:
label: Checklist
options:
- label: I searched existing issues for this problem.
required: true
- label: I removed secrets and sensitive data from the report.
required: true
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Security vulnerability
url: https://github.com/yurirocha15/mcp-cpp-sdk/security/policy
about: Report vulnerabilities privately; do not open a public issue.
42 changes: 42 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Feature request
description: Propose an SDK capability or usability improvement
title: "[Feature]: "
body:
- type: textarea
id: problem
attributes:
label: Problem
description: What user or interoperability problem should this solve?
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed behavior
description: Describe the public API and observable behavior you would expect.
validations:
required: true
- type: dropdown
id: area
attributes:
label: Area
options:
- Client
- Server
- Protocol types
- Transport
- Authentication or security
- Packaging or build
- Documentation or examples
validations:
required: true
- type: input
id: specification
attributes:
label: Specification or SEP
description: Link the relevant MCP specification or SEP when applicable.
- type: textarea
id: alternatives
attributes:
label: Alternatives
description: What workarounds or alternative designs have you considered?
25 changes: 25 additions & 0 deletions .github/ISSUE_TEMPLATE/question.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Question
description: Ask about SDK usage, behavior, or design
title: "[Question]: "
body:
- type: textarea
id: question
attributes:
label: Question
description: Include the goal you are trying to accomplish.
validations:
required: true
- type: textarea
id: context
attributes:
label: Context
description: Include relevant SDK version, protocol revision, transport, and a concise code sample.
validations:
required: true
- type: checkboxes
id: checks
attributes:
label: Checklist
options:
- label: I checked the README, generated documentation, and existing issues.
required: true
36 changes: 36 additions & 0 deletions .github/labels.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
- name: bug
color: d73a4a
description: Confirmed or reported defect
- name: enhancement
color: a2eeef
description: New feature or improvement
- name: question
color: d876e3
description: Usage or design question
- name: needs confirmation
color: fbca04
description: Needs maintainer confirmation before classification
- name: needs repro
color: f9d0c4
description: Needs a minimal reproducible example
- name: ready for work
color: 0e8a16
description: Triaged and ready to implement
- name: good first issue
color: 7057ff
description: Suitable for a first contribution
- name: help wanted
color: 008672
description: Maintainers welcome community help
- name: P0
color: b60205
description: Critical; resolve within 14 calendar days
- name: P1
color: d93f0b
description: High priority and severe impact
- name: P2
color: fbca04
description: Normal project priority
- name: P3
color: c5def5
description: Low priority or long-term work
29 changes: 28 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
name: CI

on:
# Manual runs only. The automatic triggers below stay scoped to `main` on purpose; this
# lets a feature branch be checked on the full matrix without spending CI on every push.
workflow_dispatch:
push:
branches: [ main ]
pull_request:
Expand Down Expand Up @@ -69,14 +72,35 @@ jobs:
restore-keys: ${{ matrix.os }}-cxx${{ matrix.cppstd }}-${{ matrix.linkage }}-ccache-
max-size: 500M

# MCP_REQUIRE_TWIN_LOOPBACK turns the OAuthSetterPairAtomicity skips into failures. Those tests
# need a port free on both 127.0.0.1 and 127.0.0.2, and skip when the second address is
# missing -- which would delete the whole setter-pair atomicity regression suite while the run
# still reported green. Linux binds 127.0.0.0/8 as a whole, so there the address is always
# there and its absence is a broken runner, not an unsupported host. macOS gives lo0 only
# 127.0.0.1 unless an alias is added, so the skip stays available there.
- name: Build and Test
env:
MCP_REQUIRE_TWIN_LOOPBACK: ${{ runner.os == 'Linux' && '1' || '' }}
run: >-
python scripts/build.py --examples --test
--cppstd ${{ matrix.cppstd }} --linkage ${{ matrix.linkage }}

# The README is the first code a new user copies, so compile it the way they
# would. Skipped on Windows: the check drives the compiler from
# compile_commands.json with GCC/Clang flag spellings.
- name: Compile README snippets
if: runner.os != 'Windows'
run: python scripts/check_readme_snippets.py

- name: Run Examples
run: python scripts/run_examples.py

# On the stdio transport stdout is the protocol channel. Running an example
# and checking its exit code does not notice prose printed there, so assert
# the stream separately. run_examples.py builds into build/release.
- name: Check stdio protocol streams
run: python scripts/check_stdio_streams.py build/release

sanitize:
runs-on: ubuntu-24.04

Expand Down Expand Up @@ -113,6 +137,8 @@ jobs:
max-size: 500M

- name: Build and Test with Sanitizers
env:
MCP_REQUIRE_TWIN_LOOPBACK: '1'
run: python scripts/build.py --sanitize --test

release-safety:
Expand All @@ -134,7 +160,8 @@ jobs:
python3 scripts/check_release_workflow.py
PYTHONPATH=scripts python3 -m unittest -v \
scripts.test_release_dispatch_contract \
scripts.test_release_workflow_policy
scripts.test_release_workflow_policy \
scripts.test_check_json_matrix

- name: Validate release artifacts and package templates
run: |
Expand Down
32 changes: 32 additions & 0 deletions .github/workflows/conformance-guards.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Conformance guardrails

on:
# Manual runs only. The automatic triggers below stay scoped to `main` on purpose; this
# lets a feature branch be checked on the full matrix without spending CI on every push.
workflow_dispatch:
push:
branches: [main]
pull_request:
branches: [main]

permissions:
contents: read

jobs:
alpha-runner-non-gating:
name: Alpha runner stays non-gating
runs-on: ubuntu-24.04
timeout-minutes: 5

steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: '3.12'

- name: Assert the alpha conformance runner cannot gate CI
run: python3 scripts/check_alpha_runner_guard.py
74 changes: 74 additions & 0 deletions .github/workflows/conformance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: MCP conformance regression baseline

on:
# Manual runs only. The automatic triggers below stay scoped to `main` on purpose; this
# lets a feature branch be checked on the full matrix without spending CI on every push.
workflow_dispatch:
push:
branches: [main]
pull_request:
branches: [main]

permissions:
contents: read

jobs:
conformance-2025-11-25:
name: Pinned client/server baseline (2025-11-25)
runs-on: ubuntu-24.04
timeout-minutes: 45

steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: '3.12'

- name: Set up Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version: '22'
cache: npm
cache-dependency-path: conformance/runner/package-lock.json

- name: Set up ccache
uses: hendrikmuhs/ccache-action@e42e6681d2906409c5dde4a315af6214eaa890ee # v1.2
with:
key: ubuntu-24.04-conformance

- name: Install CMake
uses: jwlawson/actions-setup-cmake@0d6a7d60b009d01c9e7523be22153ff8f19460d3 # v2
with:
cmake-version: '3.25'

- name: Cache Conan packages
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
with:
path: ~/.conan2/p
key: ubuntu-24.04-conan-conformance-${{ hashFiles('conanfile.py', 'conanfile.txt') }}
restore-keys: ubuntu-24.04-conan-

- name: Install C++ dependencies
run: python3 scripts/init.py

- name: Build conformance fixtures
run: python3 scripts/build.py --conformance --jobs "$(nproc)"

- name: Install locked official runner
run: npm ci --ignore-scripts --prefix conformance/runner

- name: Run pinned regression suites
run: bash conformance/run.sh build/release build/conformance-results

- name: Upload conformance evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: mcp-conformance-2025-11-25
path: build/conformance-results
if-no-files-found: error
retention-days: 30
3 changes: 3 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
name: Docs

on:
# Manual runs only. The automatic triggers below stay scoped to `main` on purpose; this
# lets a feature branch be checked on the full matrix without spending CI on every push.
workflow_dispatch:
push:
branches: [main]

Expand Down
14 changes: 13 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1497,16 +1497,28 @@ jobs:
id: publish
env:
AUR_SSH_PRIVATE_KEY_B64: ${{ secrets.AUR_SSH_PRIVATE_KEY_B64 }}
AUR_SSH_KEY_PASSPHRASE: ${{ secrets.AUR_SSH_KEY_PASSPHRASE }}
AUR_KNOWN_HOSTS: ${{ vars.AUR_KNOWN_HOSTS }}
VERSION: ${{ needs.contract.outputs.version }}
TAG: ${{ inputs.tag }}
run: |
install -d -m 700 "${HOME}/.ssh"
trap 'rm -f "${HOME}/.ssh/id_ed25519"' EXIT
umask 077
askpass="${RUNNER_TEMP}/aur-ssh-askpass"
trap 'ssh-agent -k >/dev/null 2>&1 || true; rm -f "${HOME}/.ssh/id_ed25519" "${HOME}/.ssh/known_hosts" "${askpass}"' EXIT
printf '%s\n' "${AUR_KNOWN_HOSTS}" > "${HOME}/.ssh/known_hosts"
grep -E '^aur\.archlinux\.org[ ,]' "${HOME}/.ssh/known_hosts" >/dev/null
printf '%s' "${AUR_SSH_PRIVATE_KEY_B64}" | base64 --decode > "${HOME}/.ssh/id_ed25519"
chmod 600 "${HOME}/.ssh/id_ed25519"
test -n "${AUR_SSH_KEY_PASSPHRASE}"
printf '%s\n' '#!/bin/sh' 'printf "%s\\n" "${AUR_SSH_KEY_PASSPHRASE}"' > "${askpass}"
chmod 700 "${askpass}"
export SSH_ASKPASS="${askpass}" SSH_ASKPASS_REQUIRE=force DISPLAY=release
eval "$(ssh-agent -s)"
ssh-add "${HOME}/.ssh/id_ed25519" </dev/null
unset AUR_SSH_KEY_PASSPHRASE SSH_ASKPASS SSH_ASKPASS_REQUIRE DISPLAY
rm -f "${askpass}"
export GIT_SSH_COMMAND="ssh -F /dev/null -o BatchMode=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=${HOME}/.ssh/known_hosts"
git clone --no-checkout ssh://aur@aur.archlinux.org/mcp-cpp-sdk.git aur-repository
cd aur-repository
git checkout HEAD -- . || true
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,15 @@ build/doxygen/
build/docs/
docs/_build/

# Conformance runner dependencies and local evidence
conformance/runner/node_modules/
conformance/results/

# Benchmark build artifacts
benchmark/cpp/build/
benchmark/cpp/build-*/
benchmark/benchmark-mcp-servers-v2/

# Generated files
compile_commands.json
graphify-out/
Loading
Loading