API And MCP Changelog
Status
Changelog for the unstable /api/v0 and MCP platform foundation.
v0 is allowed to change before public launch. Breaking changes still need a
docs update and a changelog entry so early consumers and agents can adapt.
Unreleased
-
upgraded the hosted and stdio MCP SDK to
@modelcontextprotocol/server2.0.0. Modern2026-07-28discovery returns server identity in result_metaand accepts requests withoutclientInfo; legacy initialization remains supported. After application authorization, HTTP transport rejects missing or non-JSONContent-Typewith415;application/json; charset=utf-8remains accepted. Browser preflights allow modernmcp-methodandmcp-nameheaders, and transport-rejected reads do not enter accepted invocation counts -
added hosted MCP media contribution for public unclaimed person profiles.
vrdex_profile_media_submitrequiresmcp:write assets:contribute, imports a public HTTPS image into a private proposal, and cannot publish or review it.vrdex_list_my_media_submissionsrequiresmcp:read assets:contributeand returns only the authenticated contributor's sanitized status history -
added hosted-only owner profile media management through the existing
vrdex_list_my_profilesinventory and onevrdex_profile_media_managetool. URL imports requiremcp:write assets:write, an idempotency key, and an opaque media revision; atomic metadata, placement/order, soft-delete, and restore updates require the revision but no idempotency key. Binary bytes and private upload credentials never cross the MCP JSON boundary. Contribution submission is implemented for hosted MCP and pending staged proof and production approval; review remains browser-only -
public event previews now carry
statusand up to three relevantnextSlots; cancelled events remain available by direct URL and calendar export but leave discovery, while in-progress events remain discoverable until their end time -
documented avatar appearance and trust metadata on public search results, documented event-host avatar appearance, and allowed same-origin profile asset URLs on public event image fields
-
added a hosted MCP OAuth event-write surface with per-user
AuthInfo, durable community ownership checks, transactional idempotency receipts, public readback, and sanitized audit/rate-limit attribution -
added
vrdex_profile_updateandvrdex_profile_submitto the hosted and local stdio MCP servers, plusPOST /api/v0/profiles, so outbound links and community-sourced profiles can be written from an API token or an OAuth session rather than only from the browser -
added
vrdex_list_my_profilesto both MCP servers, over the existingGET /api/v0/me/profiles. It needsprofile:read, which dynamic MCP clients may now request, and it is the only tool that returns drafts and profiles kept off public pages -- without it an owner of one could not read theupdatedAttheir own update has to pin -
added the
profile:contributescope for writing a profile the credential does not own, whether by correcting an unclaimed one or submitting a new one.profile:writekeeps meaning what its consent line says, "Edit your profiles", so credentials issued before this change gain no new authority -
breaking:
PATCH /api/v0/profiles/:slugno longer requires ownership, but a caller who does not own the target now needsprofile:contributeas well. With it, an unclaimed profile is edited as a community contributor, the same authority the web editor grants; a profile claimed by someone else answers403 -
breaking:
POST /api/v0/profilesrequiresprofile:contributerather thanprofile:write, and accepts an optionalIdempotency-Keyso a retried submission replays the first result instead of publishing a second profile -
ApiProfileWriteResponsegainedpubliclyViewable, so a client reading a profile back after a write can tell a deliberately private page from one that failed to surface -
PublicProfilegainedidandupdatedAt, and profile updates accept the latter back asexpectedUpdatedAt.outboundLinksreplaces the whole list, so two contributors correcting the same unclaimed profile could silently drop each other's links; a write pinned to a revision the profile has moved past now answers409onPATCH /api/v0/profiles/:slugand is refused onvrdex_profile_update. breaking: the field is required on every update, including one to a profile the credential owns -- owning a profile does not make you its only writer, since the same person can have the edit form open while an agent writes through a tool. Submissions have no revision to pin and do not take it -
breaking: removed the
VRDEX_HOSTED_MCP_EVENT_WRITESdeployment switch. Every hosted write tool is advertised and the connecting harness decides which it exposes; writes stay bounded by granted scopes and per-resource permission checks. Dynamic MCP clients now requestmcp:writewith at least one ofassets:write,events:write,profile:write, orprofile:contributeinstead of the fixedmcp:write events:writepair
2026-07-14
- changed external MCP readiness from exhaustive named-client confirmation to representative client and protocol coverage; untested clients remain explicit nonblocking compatibility follow-ups
- refreshed the checked hosted evidence to PR head
0dd64b2: Hosted MCP Preview Smoke run29311948404, job87018585252, passed data-backedvrdex_search, OpenAI-compatiblesearch/fetch, DCR, and CIMD against the same-branch Vercel and Convex preview - refreshed real-client hosted anonymous evidence with Gemini CLI
0.50.0against the same current preview without adding another CI run
2026-07-13
- added aggregate Dynamic Client Registration abuse limits for hashed software identities and redirect hosts in addition to the requesting network
- added a hashed application-owner aggregate cap for Client Credentials traffic in addition to per-token and per-client limits
- made Windows Gemini CLI smoke timeouts terminate native executable process
trees directly instead of leaving a child behind a
cmd.exewrapper - added API-wide CORS and automatic preflight support for
/api/v0, including bearer authorization, JSON writes, conditional/download requests, upload tokens, and browser-readable rate-limit and authentication headers - corrected the generated OpenAPI production server from
vrdex.appto the canonicalhttps://vrdex.nethost and locked it with contract coverage - added
VRDEX_HOSTED_MCP_ANONYMOUS_READS=falsefor self-hosted OAuth-only hosted MCP deployments, including fail-closed parsing, anonymous challenges, and mode-specific tool security metadata - added
pnpm smoke:mcp-cursor-agentfor standalone Cursor Agent CLI local stdio and hosted anonymous evidence; it validates the documented headless capability signature, MCP tool listing, completed structured tool events, non-empty search results, and terminal success without treating the Cursor IDE launcher as automated evidence - added preview-only, secret-gated Convex persistence for OAuth Dynamic Client Registration and Client ID Metadata Documents, plus a deterministic public hosted-search fixture on same-branch previews
- made PR Hosted MCP Preview Smoke prove data-backed anonymous reads, DCR, and
CIMD against the same-branch Vercel and Convex preview; recorded passing
Gemini CLI, MCP Inspector, and OpenAI Responses API evidence at
7fe11e8 - added a reproducible staging runtime bootstrap for non-Redis API/OAuth secrets; staging promotion now waits only on the Terraform-owned Upstash rate-limit variables
- enabled preview-only client-credentials token persistence and bearer validation without exposing a Convex admin key to Vercel; both operations use the separately gated secret-bound preview bridge
- strengthened
pnpm ops:mcp-oauth-smoke-credentialsso token verification requires an authenticated hosted MCPtools/listresponse instead of only a successful token-endpoint response - Deployed Health Checks run
29275502404passed hosted data, DCR, and CIMD against same-branch preview09a48b6 - fixed shared client-credential option mapping so Claude Code, Gemini CLI, Inspector, and OpenAI smokes cannot silently skip configured OAuth clients
- recorded the corrected MCP Inspector hosted OAuth pass from Deployed Health
Checks run
29288588007: generated client credentials issued an MCP-resource token, the bootstrap authenticatedtools/list, and Inspector repeated the authenticated tool listing against same-branch preview8144d47 - added OAuth token acquisition and forwarding to the OpenAI Responses API MCP smoke, with credential redaction and a targeted deployed-health gate that keeps ChatGPT Apps/Connectors UI evidence separate
2026-07-10
- replaced superseded staging hosted-readiness passes with current evidence
from branch deployment
baaf49e: anonymous MCP transport still works, while data-backed reads, Dynamic Client Registration, and Client ID Metadata Document persistence remain failed until staging data and server credentials are repaired - recorded real installed VS Code client passes for local stdio and hosted
anonymous HTTP after the client listed VRDex tools and completed the exact
vrdex_searchsmoke call - tightened Claude Code, Gemini CLI, and MCP Inspector
--hosted-datasmokes to reject empty result arrays, with regression coverage; current-target client evidence now supersedes passes captured from older staging revisions
2026-07-09
-
moved OAuth consent completion and authorization-code issuance behind one internal Convex mutation that atomically binds the authenticated user to the Web Crypto SHA-256 transaction digest, revalidates the stored client, consumes the transaction, and issues a code only for explicit approval
-
isolated OAuth API and MCP quotas by access-token id while retaining a secondary client-wide abuse cap, and made production rate limiting fail closed unless a shared Redis REST store is explicitly configured
-
enforced an absolute Client ID Metadata Document deadline across DNS, connection, and response streaming, and cancel rejected or oversized response bodies so slow-drip and non-200 peers cannot retain sockets
-
made Gemini CLI smoke timeouts terminate the complete process tree on Windows and POSIX, with deterministic failure handling and parent/grandchild regression coverage
-
combined API-contract and MCP verification into one PR job with one dependency install, made hosted preview coverage fail closed without same-branch Convex, and moved strict external readiness plus client-session artifacts to a manual launch workflow that live-smokes its selected host and rejects checked-in evidence that does not name the same target and commit
-
added
pnpm test:webto the existing Typecheck Web baseline job and the aggregate local verifier so the API, OAuth, MCP, and rate-limit route tests undertests/webare enforced without creating another GitHub Actions job -
preserved a constrained browser error surface for invalid authorization requests after moving consent state into short-lived server-side transactions
-
wired local Playwright Next.js servers to the generated anonymous Convex admin key so internal-function E2E coverage matches deployed server behavior
-
applied standard bearer-query rejection and anonymous public-read rate limiting to the profile asset storage probe, with route-level regression coverage and matching OpenAPI security/error responses
-
documented the upload-intent completion route's optional
multipart/form-databody from the shared OpenAPI source: direct uploads require a binaryfile, whilesourceUrlimports omit the body -
moved server-only API-token validation plus OAuth Dynamic Client Registration, Client ID Metadata Document materialization, authorization-client resolution, token exchange/rotation, revocation, and durable access-token validation to internal Convex functions; Next.js invokes them with Convex admin authentication, including atomic consent completion and code issuance
-
hardened OAuth consent with short-lived, hashed, user-bound, single-use server transactions; approval no longer trusts hidden authorization fields, and production consent POSTs require a same-origin
Origin -
enforced the declared
oauth_authorizeandoauth_tokenquotas across authorize, consent, token, and revocation routes with OAuth-compatible429bodies and standard rate-limit headers -
replaced unconditional forwarding-header trust with Vercel's
X-Vercel-Forwarded-Forcontract and an explicit self-host trusted-proxy header configuration that fails into a sharedunknownbucket -
pinned Client ID Metadata Document HTTPS connections to the validated DNS address while preserving original-host SNI, certificate verification, response-size limits, and redirects-disabled behavior
-
added hosted MCP
searchandfetchcompatibility aliases for OpenAI Responses API, ChatGPT deep research, and company-knowledge-style connectors; the aliases reuse the same anonymous public search/profile/event/world read surfaces, return URL-backed structured document results, and are counted in MCP tool invocation telemetry -
tightened
pnpm smoke:mcp-openaiso it loads repo-root.env.localwithout printing secret values, avoids inline key guidance in generated smoke plans, fails bounded live Responses API requests with a clear timeout, and preflights hosted/mcpforsearch/fetchplus data-backed results before calling OpenAI -
changed the default
pnpm smoke:mcp-openailive model togpt-5.6-luna, the current cost-sensitive GPT-5.6 tier, after verifying that it calls the staged remote MCPsearchandfetchtools -
tightened
pnpm smoke:mcp-compat -- --hosted-dataso hosted data-backed evidence requires a non-emptyvrdex_searchresult and an OpenAI-compatiblesearchresult that can be passed tofetch; added--hosted-query/VRDEX_MCP_SMOKE_QUERYfor targets whose public seed data needs a known non-empty query -
tightened hosted MCP evidence recording and rollout validation so
hosted-data-backed-anonymous-readcannot be markedpassunless the sanitized evidence mentionsvrdex_search,search, andfetchcoverage from the same hosted data-backed smoke -
refreshed the major-client MCP source check against current official VS Code, Claude Code, Cursor, and Devin Desktop / Windsurf Cascade docs and narrowed the next burn-down batch to installed-app VS Code, Cursor, and Windsurf evidence, with hosted OAuth rows still gated on credentials or product-surface access
-
extended
pnpm ops:mcp-client-smokesandpnpm ops:mcp-client-session-packwith--hosted-query/VRDEX_MCP_SMOKE_QUERYso generated real-client smoke commands can target a known non-empty public search fixture -
aligned generated MCP client evidence worksheets with the selected
--hosted-queryvalue and clarified the OpenAI / ChatGPT hosted OAuth recorder placeholder so those rows ask for bothsearchandfetchevidence -
aligned
pnpm ops:mcp-installed-clientsandpnpm ops:mcp-oauth-smoke-credentialshosted smoke guidance with the same known-query flags for Claude Code, Gemini CLI, OpenAI Responses API, and MCP Inspector -
recorded interim hosted MCP target diagnostics before the later staging redeploy: the earlier staging target returned HTTP 404 for
/mcpand public search, while the PR preview exposedsearch/fetchbut failed backend-dependent data-backed reads, DCR, and public-client CIMD authorization -
extended the MCP client session pack so newly reopened Claude Code and MCP Inspector hosted-anonymous rows get generated evidence worksheets instead of failing the worksheet-coverage guard
-
added generated
docs/api/openapi.yamlalongsidedocs/api/openapi.json; both artifacts are emitted from the shared API contract package, served under/api/v0/openapi.{json,yaml}, and covered bypnpm check:api-openapidrift detection -
documented
GET /api/v0/profile-assets/upload-intents/probein the shared OpenAPI contract as the profile asset upload storage health probe
2026-07-08
- moved public API query parsing for search, event lists, active worlds,
authenticated owner inventory, and developer credential lists into shared API
contract helpers; the generated OpenAPI artifact now documents the actual
route-specific
limitcaps for upcoming/community events and active worlds - added
apiWriteAuditEventsandpnpm ops:api-platform-observabilityso operators can summarize public API write actions, rate-limit blocks, token validation failures, OAuth grant outcomes, and MCP tool calls from durable Convex event rows without exposing bearer tokens, OAuth secrets, upload tokens, or raw IP addresses - added aggregate route-class request counters to the hot rate-limit backend
and
pnpm ops:api-rate-limit-countsso operators can read current request-count signals from Redis without writing every API/MCP request to Convex - added durable
apiRateLimitEventsrows for blocked public API, hosted MCP, Dynamic Client Registration, and Client ID Metadata Document rate-limit attempts, recording route class and identity kind without storing raw IPs, credential ids, Redis keys, or bearer values - added durable
mcpToolEventsrecords for accepted hosted MCPtools/callinvocations so anonymous and authenticated tool usage can be counted by curated tool name and route class without storing bearer tokens or raw IP addresses - added
infra/terraform/rate-limit-redisto provision the BASIC BIT hosted Upstash Redis rate-limit counter store and write the corresponding Vercel runtime variables for production/staging while leaving default PR previews on memory unless operators explicitly opt them into the shared store; the Terraform workflow now validates/plans the stack with manual apply, and the API/MCP rollout checker now requires the stack files, lockfile, and CI wiring - added an Open Blocker Summary to
pnpm ops:mcp-client-smokesso the remaining day-one MCP client rows are grouped by the prerequisite that unlocks them, instead of appearing only as a flat non-pass matrix - extended the generated
mcp-client-session-packREADME with the same Open Blocker Summary so uploaded PR artifacts are directly usable for operator smoke-session batching - refreshed the production-like hosted MCP evidence rows with 2026-07-09
staging evidence after PR branch staging deploy run
29037734496: the data-backed anonymous-read, Dynamic Client Registration, and public-client Client ID Metadata Document rows now pass againsthttps://staging.vrdex.net/mcp - extended
pnpm ops:mcp-installed-clientswith informational CLI automation notes so VS Codechat, Cursor--chat/agent, and Windsurf setup-only surfaces are clearly treated as manual-only evidence paths unless the real client session lists tools and callsvrdex_search - extended
pnpm ops:mcp-installed-clientswith read-only Claude Desktop process/app-path detection plus OpenAI Responses API and Gemini CLI model credential preconditions so missing provider setup is visible before a smoke session starts - refreshed the installed-client preflight notes for VS Code 1.128.0, Cursor
3.10.17, and Windsurf 1.110.1; their CLIs still accept the generated local
stdio, hosted anonymous HTTP, and hosted token-header fallback
--add-mcpdefinitions while the matrix rows stay pending until real app tool-call evidence is captured - added
pnpm smoke:mcp-gemini-clias a repeatable real-client Gemini CLI harness for local stdio and hosted Streamable HTTP MCP smokes, with optional disposable@google/gemini-clipackage execution and token-backed hosted OAuth fallback support - recorded Gemini CLI local stdio as passing against the repo API fixture with
Gemini CLI
0.50.0; hosted anonymous staging still times out before a hosted MCP tool-call result, and a retry with a live staging query hit Gemini API quota before MCP evidence, so the row remains failed in the manual matrix - added
pnpm smoke:mcp-openaias a repeatable OpenAI Responses API remote MCP hosted anonymous-read harness, keeping ChatGPT Apps/Connectors UI and hosted OAuth evidence as separate product-surface rows - recorded the OpenAI Responses API hosted anonymous row as passing against
https://staging.vrdex.net/mcp: after the PR branch staging deploy, the smoke reached the Responses API andgpt-5.6-lunacalled hosted MCPsearchandfetch - changed
GET /api/v0/searchto return a typed RFC 9457503problem when the public search backend is temporarily unavailable, and regenerated the OpenAPI JSON/YAML artifacts from the shared contract source - fixed the Gemini CLI smoke harness on Windows so disposable package execution
routes through
cmd.exeinstead of spawningnpx.cmddirectly; local preflight can reach Gemini CLI and fails closed on provider auth/quota before any matrix row is recorded - tightened the Gemini CLI smoke harness timeout path so a timed-out child process is given a short close grace before the disposable project directory is removed, reducing transient Windows cleanup locks during failed client smokes
- added
pnpm ops:mcp-hosted-oauth-prereqsas a read-only GitHub Actions variable/secret audit for the hosted MCP OAuth evidence path, covering both reviewed OAuth smoke secrets and temporary credential generation without reading secret values - clarified that
pnpm ops:mcp-installed-clientsreads only current-process OAuth credential-generation inputs and should be paired withpnpm ops:mcp-hosted-oauth-prereqsfor the repository variable/secret audit - extended
pnpm ops:mcp-client-session-packhosted OAuth worksheets and README guidance to include the GitHub prerequisite audit before manual OAuth evidence capture - extended
pnpm ops:mcp-client-smokeshosted OAuth setup hints to point operators at the same GitHub prerequisite audit before client sessions - wired PR Baseline Checks to upload the generated
mcp-client-session-packartifact from the MCP verifier job so reviewers can start the remaining manual client smoke rows from checked setup files and evidence worksheets - clarified generated MCP client worksheets so failed client attempts can be recorded with sanitized blocker evidence, not only successful tool-call transcripts
- extended
pnpm ops:mcp-installed-clientsto report whether thedeployed-health.ymlhosted MCP OAuth smoke can mint temporary credentials through the hosted E2E auth/developer-credential helper gate, without printing browser tokens or generated client secrets
2026-07-07
- tightened
pnpm check:api-mcp-rolloutso the aggregate readiness gate checks every current checked-in/api/v0OpenAPI path and requires both MCP evidence recorder scripts before launch-readiness claims - tightened the MCP client and hosted evidence recorders so pass/fail entries
cannot use generated
<placeholder>evidence, environment, or target values - added Gemini CLI to the required day-one MCP client matrix after a current
docs pass confirmed stdio, Streamable HTTP, OAuth discovery, Dynamic Client
Registration, and
/mcp authsupport - extended
pnpm smoke:mcp-inspectorwith reviewed OAuth app client-credentials token acquisition plusVRDEX_MCP_INSPECTOR_OAUTH_TOKENfallback support so Inspector hosted OAuth evidence can validate authenticatedtools/listwith an MCP-resourcemcp:readtoken without printing the token or client secret - extended
pnpm smoke:mcp-claude-code -- --mode hosted-httpwith reviewed OAuth app client-credentials token acquisition plusVRDEX_CLAUDE_CODE_OAUTH_TOKENfallback support so Claude Code hosted OAuth evidence can validate an authenticatedvrdex_searchcall with an MCP-resourcemcp:readtoken without printing the token or client secret - added
pnpm ops:mcp-client-session-packto generate disposable VS Code, Cursor, Windsurf, and Gemini CLI MCP smoke-session configs, prompts, launch commands where supported, per-row evidence templates, and recorder commands under.tmp-gh-artifacts/ - extended
pnpm record:mcp-client-smokewith--evidence-fileso a completed generated worksheet can drive a matrix update while still rejecting pending worksheets, placeholders, and evidence summaries that appear to contain tokens, secrets, or authorization headers - extended
pnpm ops:mcp-client-session-packwith manual-only evidence worksheets for Claude Desktop, Claude Code hosted OAuth, OpenAI/ChatGPT hosted rows, and MCP Inspector hosted OAuth so every remaining required MCP client row can use the same worksheet recorder flow - tightened
pnpm ops:mcp-client-session-packso it reads the MCP client smoke matrix and fails if a required row that is not alreadypasslacks a generated worksheet - corrected VS Code, Cursor, and Windsurf smoke-session setup commands to use
isolated
--user-data-dirpaths and PowerShell-safe escaped JSON for--add-mcpafter the current Windows CLIs rejected fresh named profiles and raw(Get-Content -Raw ...)JSON arguments - tightened
pnpm ops:mcp-client-session-packso each generated VS Code, Cursor, and Windsurf row uses its own isolated user-data directory instead of letting local, hosted anonymous, and token-fallback configs overwrite the samevrdexserver entry - added
pnpm ops:mcp-add-mcp-preflightto verify that installed VS Code, Cursor, and Windsurf CLIs accept the generated local stdio, hosted anonymous HTTP, and hosted token-header fallback--add-mcpdefinitions before a human starts manual tool-list andvrdex_searchevidence capture - tightened
pnpm ops:mcp-add-mcp-preflightselector parsing so repeated--clientand--configflags are additive, matching the existing comma-separated selector form - added
pnpm ops:mcp-oauth-smoke-credentialsto mint temporary staging OAuth smoke credentials through the gated E2E auth helper path, verify client-credentialsmcp:readtoken issuance and authenticated hosted MCPtools/list, and write ignored env files for Claude Code and MCP Inspector hosted OAuth smokes without printing the client secret - wired the manual
deployed-health.ymlhosted-mcp-smokeOAuth path to mint temporary staging smoke credentials through the same helper when repository OAuth smoke secrets are absent but hosted E2E auth and developer-credential helpers are enabled - extended
pnpm ops:mcp-installed-clientsto report hosted OAuth smoke credential readiness for Claude Code and MCP Inspector without printing secret values
2026-07-06
- added
GET /api/v0/worlds/:slug/eventswith a sharedPublicWorldEventsResponsecontract for recent and upcoming public events linked to a published world - added
pnpm ops:mcp-client-smokesto generate the current day-one MCP client smoke run plan, including repo preflight commands, manual evidence prompts, and recorder command templates from the checked matrix - added
pnpm record:mcp-client-smoketo record sanitized manual MCP client smoke evidence into the checked compatibility matrix without hand-editing JSON - added
pnpm smoke:mcp-claude-codeas a repeatable real-client Claude Code local stdio and hosted anonymous HTTP smoke - extended
pnpm smoke:mcp-claude-code -- --mode hosted-httpwith--hosted-dataso Claude Code hosted anonymous-read readiness can require a non-empty data-backed public search - added
pnpm smoke:mcp-inspectoras a repeatable hosted MCP Inspector CLI smoke for tool-list/auth-metadata coverage and optional data-backed public search readiness - added
pnpm check:api-mcp-rolloutas an aggregate readiness audit for the generated OpenAPI artifact, required docs, verification scripts, MCP client matrix, and production-like hosted MCP evidence state - added deterministic
/oauth/tokenroute-helper coverage for Authorization Code, refresh-token rotation, Client Credentials, and no-store OAuth errors before malformed exchanges reach Convex - added
pnpm ops:mcp-installed-clientsto capture installed MCP client CLI version/configuration preflight evidence before manual day-one client smokes - tightened MCP smoke result recording so required hosted rows need an explicit same-branch, staging, production-like, or production target before they can be marked as external-readiness pass evidence
- tightened MCP client matrix verification so hand-edited required hosted pass rows still need non-pending same-branch, staging, production-like, or production target evidence
- added
pnpm test:scriptsto exercise repo script regression tests from the MCP verification path - improved hosted MCP data-backed smoke diagnostics so tool-error responses include sanitized error content instead of a generic failure
- returned non-empty public-safe hosted MCP tool errors when the public data backend is unavailable, without exposing backend exception text
- added
pnpm smoke:mcp-compat -- --hosted-onlyfor focused remote hosted MCP target checks without rerunning local stdio profile smokes - added hosted MCP tool descriptor auth metadata so every curated public read
tool advertises
_meta["securitySchemes"]withnoauthplus optionaloauth2/mcp:read - split hosted MCP smoke coverage so lightweight preview checks still cover
transport, descriptors, OAuth metadata, and bearer challenges, while
--hosted-data/VRDEX_MCP_SMOKE_DATAgates non-empty public reads against a same-branch or production-like Convex backend - added
pnpm smoke:mcp-compat -- --continue-on-failureandVRDEX_MCP_SMOKE_CONTINUE_ON_FAILUREso production-like hosted diagnostics can report data-backed read, DCR, and CIMD subcheck failures in one run while still exiting non-zero when any selected probe fails
2026-07-04
Public API and MCP platform foundation checkpoint:
- added shared
@vrdex/api-contractsschemas for public API responses and generated OpenAPI output - added anonymous
/api/v0public read routes for search, profiles, events, worlds, profile assets, and claim status - added generated OpenAPI JSON at
/api/v0/openapi.jsonand a web API reference page at/developers/api - added personal API token creation, listing, revocation, hashed validation, and developer token UI
- added user-owned OAuth application registration, confidential client secrets, and app listing UI
- added OAuth metadata, JWKS, token, revoke, constrained dynamic MCP registration, Authorization Code with PKCE, refresh-token rotation, refresh-token revocation, and Client Credentials support
- added OAuth access-token signing-key rotation support for retaining previous public keys in JWKS and bearer verification until outstanding tokens expire
- added OAuth access-token validation event metadata for accepted and rejected API/MCP bearer checks
- added public-client Client ID Metadata Document support for hosted MCP OAuth clients that use URL-form client ids
- added confidential-client support for OAuth authorization-code and refresh-token exchange, requiring active client-secret authentication while keeping PKCE mandatory
- added hosted Streamable HTTP MCP at
/mcpwith anonymous public read tools and OAuth-authenticated MCP bearer handling - added MCP protected-resource scope metadata and scope-aware
WWW-Authenticatechallenges for malformed, invalid, or insufficient OAuth bearer tokens - added local stdio MCP workspace package
@basicbit/vrdex-mcp - added default API/MCP rate-limit classes with memory and Redis REST store modes
- added trusted-partner effective rate-limit policies for validated trusted-partner personal tokens and OAuth applications
- added a checked manual MCP client smoke-results artifact and verifier so day-one client compatibility evidence is explicit before external readiness
- added structured hosted MCP readiness evidence rows and a recorder command so data-backed anonymous reads, DCR, and CIMD proof are checked separately from client UI smoke rows
- added
GET /api/v0/usage/rate-limitfor route-class quota policy and caller window introspection - added
GET /api/v0/mefor authenticated caller introspection - added
GET /api/v0/me/profiles,GET /api/v0/me/communities, andGET /api/v0/me/eventsfor user-authorized profile, community, and community-managed event inventory - added
PATCH /api/v0/profiles/:slugforprofile:writeclaimed-owner metadata updates against profiles owned by the current authenticated user - added
POST /api/v0/profiles/:slug/assets/upload-intentforassets:writeone-time media-kit uploads against claimed profiles owned by the current authenticated user - documented
POST /api/v0/profile-assets/upload-intents/:intentIdin the generated OpenAPI contract as the one-time upload-token transport for direct file uploads and server-side source imports - documented
GET /api/v0/profiles/:slug/assets/:assetId/fileandGET /api/v0/profiles/:slug/logos.zipin the generated OpenAPI contract as binary download routes, and added route/OpenAPI parity checking to the contract drift check - added
POST /api/v0/eventsforevents:writepublic event creation against community profiles owned by the current authenticated user - added
PATCH /api/v0/events/:slugforevents:writepublic event updates against community-owned events managed by the current authenticated user - added
GET /api/v0/developer/tokensandGET /api/v0/developer/oauth-appsfordeveloper:readuser-owned credential metadata lists - extended
GET /api/v0/developer/oauth-appsto include OAuth apps owned by claimed community profiles the current authenticated user actively owns - added
POST /api/v0/developer/tokensfordeveloper:writeuser-owned personal API token creation with one-time token value return - added
POST /api/v0/developer/oauth-appsfordeveloper:writeuser-owned OAuth application creation with one-time confidential client secret return - added
ownerCommunitySlugtoPOST /api/v0/developer/oauth-appsfor owner-only community OAuth application creation - added claimed-community owner selection to
/developers/appsso the dashboard can create and list community-owned OAuth apps - added
PATCH /api/v0/developer/oauth-apps/:clientIdfordeveloper:writeuser-owned and community-owned OAuth application metadata, redirect, grant, and scope updates - added
POST /api/v0/developer/oauth-apps/:clientId/secretsfordeveloper:writeuser-owned and community-owned confidential OAuth client secret creation with one-time secret return - added
DELETE /api/v0/developer/tokens/:tokenIdandDELETE /api/v0/developer/oauth-apps/:clientIdfordeveloper:writeuser-owned and community-owned credential revocation - added developer docs for public API posture, auth, OAuth apps, rate limits, MCP tools, and rollout checks
Compatibility notes:
- API-resource OAuth tokens are required for
/api/v0 - MCP-resource OAuth tokens are required for hosted
/mcp - local stdio MCP calls
/api/v0, so it uses API-resource OAuth tokens - bearer credentials in URL query parameters are rejected
- developer list routes require user authority; app-only OAuth tokens cannot enumerate a user's token or OAuth app inventory
- profile asset upload-intent creation uses the
asset_upload_intentroute-limit class, while the upload transport uses the one-time upload token - final quota numbers and trusted-partner escalation thresholds remain pre-launch tuning decisions even though trusted-partner credentials now have a distinct effective quota tier