Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Immersive Commons

REMOTE · WWW.IMMERSIVECOMMONS.COM · SCANNED SEP 28

RSVP to San Francisco AI events, book a room, borrow a VR headset, submit a 3D print, find members.

0 this week 68 Trust /100

Recent critical change

Authorization (9 Sept 2026). See the changelog before you install this server.

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security66
Transport & Reachability100
Schema Quality & AI Usability76
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 6506 tokens (~260/item across 25 items; 22 tools + 3 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management6
  • Stability check failed: schema churn in the 30 days we've observed: 179 tool removals, 0 breaking changes, 0 auth/transport breaks, 11 additions. See how to fix → Fail
Tool Coverage93
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 78% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
  • Supports UI / widget rendering.Pass
Install

How do I install the Immersive Commons MCP server?

Immersive Commons is a hosted endpoint at https://www.immersivecommons.com/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · www.immersivecommons.com

# add to Claude Code
claude mcp add --transport http com-immersivecommons-floor10 'https://www.immersivecommons.com/api/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "com-immersivecommons-floor10": {
      "url": "https://www.immersivecommons.com/api/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-immersivecommons-floor10": {
      "type": "http",
      "url": "https://www.immersivecommons.com/api/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.com-immersivecommons-floor10]
url = "https://www.immersivecommons.com/api/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-immersivecommons-floor10": {
      "type": "remote",
      "url": "https://www.immersivecommons.com/api/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-immersivecommons-floor10 --url 'https://www.immersivecommons.com/api/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  com-immersivecommons-floor10:
    url: "https://www.immersivecommons.com/api/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-immersivecommons-floor10": {
      "Transport": "http",
      "Url": "https://www.immersivecommons.com/api/mcp"
    }
  }
}
# add to Vellum
assistant mcp add com-immersivecommons-floor10 -t streamable-http -u 'https://www.immersivecommons.com/api/mcp'
// mcp.json
{
  "mcpServers": {
    "com-immersivecommons-floor10": {
      "type": "http",
      "url": "https://www.immersivecommons.com/api/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 14 Sept 26 −1
    • Tool “ic_scheduling_manage_booking” rewrote its description, which is the text the model reads security
  • 13 Sept 26 +1
    • Tool “ic_scheduling_manage_booking” rewrote its description, which is the text the model reads security
    • Server version: 1.37.0 → 1.39.0 functional
  • 12 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “ic_news_get” rewrote its description, which is the text the model reads security
    • Schema quality: 226 → 257 ▼ functional
    • Tool coverage: 72% → 78% ▲ functional
    • Server version: 1.35.0 → 1.37.0 functional
    • New tool “ic_scheduling_get_availability” functional
    • New tool “ic_scheduling_list_meeting_types” functional
    • New tool “ic_scheduling_manage_booking” functional
  • 9 Sept 26 0
    • Authorization: unverified → fail ▼ critical
    • The server rewrote its instructions, which are the text every model session reads security
    • New tool “ic_forms_withdraw”, which the server declares destructive security
    • Schema quality: 191 → 226 ▼ functional
    • Tool coverage: 65% → 72% ▲ functional
    • Destructive annotations: pass → 100 functional
    • Server version: 1.34.0 → 1.35.0 functional
    • New tool “ic_forms_get” functional
    • New tool “ic_forms_list” functional
    • New tool “ic_forms_my_submission” functional
    • New tool “ic_forms_submit” functional
  • 8 Sept 26 +7
    • Judged manipulation: unverified → pass ▲ security
    • Schema quality: unverified → excellent ▲ functional
  • 7 Sept 26 −7
    • Judged manipulation: pass → unverified ▼ security
    • The server rewrote its instructions, which are the text every model session reads security
    • Schema quality: excellent → unverified ▼ functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 28 Sept 2026 · Probed https://www.immersivecommons.com/api/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=www.immersivecommons.com CN=YR1,O=Let's Encrypt,C=US 17 Sept 2026 16 Dec 2026 RSA 2048 SHA256-RSA 65745babedcf10784f98740699d8be9b954
SANs: www.immersivecommons.com
CN=YR1,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA a20253f15f2691c05dc1ce13b9bcca4e
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of www.immersivecommons.com. — Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
immersivecommons.com. present 15019 8 Verified
www.immersivecommons.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy strict-origin-when-cross-origin
permissions-policy camera=(self), microphone=(self), display-capture=(), geolocation=(), payment=(), usb=(), serial=(), hid=(), bluetooth=(), midi=(), browsing-topics=()

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://www.immersivecommons.com/api/mcp Verified 200
http (plaintext) http://www.immersivecommons.com/api/mcp HTTPS enforced 308 https://www.immersivecommons.com/api/mcp
MCP tools · 22 exposed · ~5,814 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
ic_donate ~231

Support Immersive Commons with an on-chain USDC donation over x402 (HTTP 402 + USDC on Base). No auth required. Returns the donation tiers, the receiving wallet (payTo), the asset + network, and the donate URL. MCP can't run the in-band 402 handshake itself, so to donate: POST https://www.immersivecommons.com/api/x402/donate with an x402 X-PAYMENT header (sign an EIP-3009 USDC authorization for one of the tier amounts to payTo on the given network); the first call with no X-PAYMENT returns a 402 listing every tier in accepts[]. Optional donor { name, message } can be sent in the JSON body and appear on the public donor wall at /donate. Args: { tier?: string (a tier label, case-insensitive — narrows tiers[] to that single tier and adds `selected_tier` with the exact atomic USDC amount to sign; an unknown label returns error_kind:"validation" naming the valid labels) }.

NameTypeReqDescription
tierstring––

No output schema declared.

No examples provided.

ic_donations_total ~79

Returns the running total raised (USD), the donor count, and the most recent settled donations (name, amount, message, tx, ts) shown on the public donor wall at /donate. No auth required. Args: { limit?: number (1-50, default 10) }.

NameTypeReqDescription
limitinteger––

No output schema declared.

No examples provided.

ic_forms_get ~401

The whole definition of one form: every question, its `kind` (short | long | bool | choice | email | url), whether it is required, the exact `options` a `choice` answer must match, and a `why` saying what the answer is actually used for. THIS IS THE READ-BEFORE-YOU-WRITE TOOL — call it before ic_forms_submit so you answer well instead of guessing, and relay each `why` to your human rather than deciding for them what a question is really asking. `facts` carries the program's own terms (things like how long it runs and what it pays) as ordered label/value pairs — read them to your human BEFORE they commit to anything. `gates` names the questions whose 'no' decides most submissions on its own; a truthful no there is recorded rather than blocking, and beats a flattering yes. TWO DIFFERENT RINGS, and confusing them is the main way an agent misleads its human here: `audience` is the minimum ring to SUBMIT (often `public`, meaning anyone at all), while `approval_requires_tier` is the minimum ring to be APPROVED. Anyone may raise a hand on an open call; being taken can still require membership. Report both, and never tell your human they qualify on the strength of `can_submit` alone. `accepting_submissions` is live runtime state, not a property of the definition — a form can be closed between your read and your submit. Args: { form_id }. Returns: { ok, form, can_submit, accepting_submissions, cannot_submit_reason?, required_tier? }. No auth required. An unknown form and a form you may not see return the SAME not_found, on purpose — telling a stranger 'that exists but is not for you' is itself the disclosure.

NameTypeReqDescription
form_idstringyesFrom ic_forms_list. Do not invent one.

No output schema declared.

No examples provided.

ic_forms_list ~208

Every form Immersive Commons is currently taking answers to, filtered by who you are. START HERE — do not guess a form id. Each entry carries its `form_id`, title, summary, the membership ring it is open to, whether YOU can answer it right now, and if you cannot, the reason and the ring you would need. A form you can SEE but not answer is LISTED rather than hidden, because a program nobody outside can discover is a program nobody outside ever joins; a form you may not see at all is omitted, because a list of titles you cannot open is a disclosure with no upside. What a listing never contains is anyone's answers. Args: none. Returns: { ok, count, forms[{ form_id, title, summary, audience, can_submit, cannot_submit_reason?, required_tier?, question_count }] }. No auth required; sending a token narrows nothing and only lets `can_submit` be truthful about your human's actual ring.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

ic_forms_my_submission ~249

The status of one submission — YOUR human's, never anybody else's. No token required. Two ways in: a signed-in identity resolves its own record with no id at all, or `submission_id` plus the `claim_token` handed back once at submit time opens the record that token belongs to. An id ALONE never works: ids travel through URLs and chat logs, and if an id were a credential every stranger's answers would be readable by anyone who ever saw a link. A wrong id, a wrong token and an id that was never issued all return the same `found: false`, so this cannot be used to test which ids exist. What comes back is status, dates and failed gates — never the answers as stored, never the reviewer's private note. Args: { form_id, submission_id?, claim_token? }. Returns: { ok, found, submission? }. No auth required.

NameTypeReqDescription
claim_tokenstring–The one-time token returned at submit. Must be sent WITH submission_id; either alone does nothing.
form_idstringyesWhich form.
submission_idstring–Needed only when reading by claim token rather than by identity.

No output schema declared.

No examples provided.

ic_forms_submit ~440

Submit answers to one form. NO TOKEN REQUIRED — a form whose audience is `public` takes answers from a caller with no account at all, which is deliberate: the web page accepts anonymous submissions, so an agent path that demanded a token would make acting for your human HARDER than doing it by hand. Each form still declares its own audience ring and it is checked here, live, on every call; a refusal names the ring and how to ask for it, and is distinct from 'no such form'. THIS WRITES A REAL SUBMISSION UNDER A REAL PERSON'S NAME. CONFIRM EVERY ANSWER WITH YOUR HUMAN BEFORE CALLING THIS AND NEVER INVENT ONE — an answer you guessed becomes a promise they have to keep, and the gate questions in particular are commitments rather than preferences. Call ic_forms_get first for the question ids, kinds and exact allowed options. WHAT THIS IS: an expression of interest that opens a screening step — NOT a final application, and nothing is signed here. Do not tell your human they have applied; tell them they have raised their hand. If they are selected, a separate application arrives from the partner out of band. One submission per email address per form; a second is REFUSED and the first is NOT overwritten, so a correction goes to the form's contact address rather than a resubmit. A `claim_token` comes back ONLY for an unattributed submitter, and only once — surface it verbatim, because it is then the only way they can ever read their own submission again. A caller carrying an identity gets none and does not need one. Args: { form_id, answers }. Returns: { ok, submission_id, status, failed_gates, claim_token?, counts, message }. No auth required; a token only attributes the submission.

NameTypeReqDescription
answersobjectyesKeyed by question id, exactly as ic_forms_get returned them. Booleans may be sent as true/false or as the strings 'true'/'false'/'yes'/'no'. Omit an optional question rather than sending an empty str…
form_idstringyesFrom ic_forms_list.

No output schema declared.

No examples provided.

ic_forms_withdraw ~413

Take your human's own submission back. NO TOKEN REQUIRED, and no token grants this on anyone else's behalf: the ONLY things that open a record here are your human's signed-in identity or the submission_id plus the one-time claim_token handed back at submit. An operator cannot do it for them, a reviewer cannot do it for them, and `admin:forms_manage` does not reach this — withdrawing belongs to the person who submitted, because a reviewer withdrawing on somebody's behalf is a rejection wearing that person's name. CONFIRM WITH YOUR HUMAN BEFORE CALLING, in the plainest words you have. THIS CANNOT BE UNDONE BY ANYONE HERE: no reviewer can move a withdrawn record back, and on a form that asks for an email address, answering again on that address is REFUSED, so a withdrawal is not a way to redo an application. If they had been APPROVED, withdrawing hands their place back to the group and somebody on the waitlist can take it — `freed_slot` in the response tells you whether that happened, and it is the sentence to read to them. Idempotent: a record that was already withdrawn comes back ok with `changed: false` rather than an error, so a retry after a timeout is safe. A wrong id, a wrong token and an id that was never issued all return the same `found: false`, so this cannot be used to test which ids exist. Args: { form_id, submission_id?, claim_token? }. Returns: { ok, found, submission_id?, status?, previous_status?, changed?, already_withdrawn?, freed_slot?, counts?, message }. No auth required.

NameTypeReqDescription
claim_tokenstring–The one-time token returned at submit. Must be sent WITH submission_id; either alone withdraws nothing.
form_idstringyesWhich form.
submission_idstring–Needed only when the submitter has no IC account. A signed-in submitter needs neither this nor the token.

No output schema declared.

No examples provided.

ic_funko_catalog ~218

The full catalog of things a Funko Me figure can earn — animation clips, props, skins, stages — with the condition that unlocks each one. No auth required; this is the rules table, not anybody's progress. Use it to explain to a human WHY something is locked, or to show what is worth doing on the floor. An item with no `requires` is granted to every signed-in member. Conditions read as either { signal, gte } (a measurable: commits this week, GLM tokens burned, events attended, days of tenure) or { minTier } (a membership ring). For one member's actual progress against these, call ic_funko_progress. Args: { kind?: 'clip'|'prop'|'skin'|'stage'|'capability' }. Returns: { ok, count, items[{ id, kind, label, blurb?, rarity, requires?, asset? }] }. No auth required.

NameTypeReqDescription
kindstring–Optional filter — return only unlocks of this kind.

No output schema declared.

No examples provided.

ic_news_get ~180

Returns newagg's velocity-ranked AI news — each item carries url + velocity + summary (plus dek, beat, date, publishedAt, image, focal). This is the RAW aggregator feed (the same firehose that drives the floor10 news kiosk), a DIFFERENT surface from ic_signal_* (which serves THE SIGNAL, the weekly editorial dispatch). Items come back ranked highest-velocity-first (ties keep the feed's own order). No auth required. Args: { limit?: number (1-25, default 20), min_velocity?: number (>=1, default 1 — keep only items corroborated by >= this many sources), q?: string (2-80 chars, case-insensitive substring over title + summary) }.

NameTypeReqDescription
limitinteger––
min_velocityinteger––
qstring––

No output schema declared.

No examples provided.

ic_presentations_get ~253

Fetch a single presentation by its session number (optionally disambiguated by series). Session numbers are VCN-only; non-VCN talks (ClawCamp, standalone Talks) have no session_no — discover those via ic_presentations_list (filter series='ClawCamp'). No auth required. Returns the full ingest-friendly record. Args: { session_no: number, series?: string }. Returns: { scaffold, presentation: { session_no, series, title, date, format, public_url, deployed, speaker?, event?, summary?, content? } } where `content` is the talk's full curated llms.txt distillation (present for decks that ship one — read it instead of fetching the deck). On a miss, an error listing the available { series #session_no } entries. If session_no alone is ambiguous across series, the newest match wins — pass `series` to target one exactly.

NameTypeReqDescription
seriesstring–Optional series to disambiguate when the same session_no exists in multiple programs (e.g. a VCN #1 and a ClawCamp #1).
session_nointegeryesThe session number within its series (from ic_presentations_list).

No output schema declared.

No examples provided.

ic_presentations_list ~324

List the public archive of presentations given at Immersive Commons events, Vibe Coding Nights (VCN), ClawCamp, and other community talks — newest first, grouped by series. No auth required. NOT to be confused with ic_resources_list (that lists bookable rooms). Use ic_presentations_get for one VCN session's detail. Args: { series?: string (e.g. 'VCN'|'ClawCamp'|'Talk'), format?: 'deck'|'slides'|'video'|'doc'|'link', limit?: number (max 200, default 100) }. Returns: { count, total, series: string[], scaffold, by_series: Array<{ series, presentations: P[] }>, presentations: P[] (flat) } where P = { session_no (number, VCN-only; null for non-VCN talks), series, title, date, format, public_url, deployed, speaker?, event?, summary? }. `scaffold:true` means placeholder data (real manifest not yet synced). `public_url` is a direct view/download link, null if unpublished (local-only).

NameTypeReqDescription
formatstring–Optional filter to one artifact kind.
limitinteger–Default 100; max 200. Applied to the flat newest-first list before grouping.
seriesstring–Optional filter to one series/program (case-insensitive), e.g. 'VCN', 'ClawCamp', 'Talk'. See the `series` array in a prior response for the live set.

No output schema declared.

No examples provided.

ic_scheduling_get_availability ~538

Open slots for one meeting type AND the member's full booking policy, in ONE response. The policy is included deliberately so you can solve locally instead of probing: repeated narrowing calls are what turn a lookup into a negotiation, and this surface refuses to be negotiated with. Every start/end is UTC ISO-8601 with a trailing Z; member.tz and the echoed viewer_tz are IANA zone names — never do wall-clock arithmetic without one. READ complete BEFORE YOU READ slots. ok:true with complete:false is an INCOMPLETE SUCCESS, not a failure: part of the member's calendar could not be read, coverage.unknown_minutes says how much and unknown_windows[] says which windows and why. Those windows are OMITTED from slots, never guessed free — so do not tell your human the member is free then, and do not tell them the member is busy then either. The honest sentence is that we could not see part of their calendar. horizon.effective_to may be earlier than what you asked for when a member's constraint data runs out; that is 'not offered', which is a definite statement and is NOT the same fact as unknown. An empty slots with complete:true genuinely means booked solid or outside the window. NO TOKEN REQUIRED. The same reads are served by the scheduling service itself at https://sched.skew.site; its protocol document is https://sched.skew.site/v1/.well-known/scheduling. Args: { handle, meeting_type, from?, to?, tz? }. Returns: { ok, complete, member, meeting_type{duration_minutes,slot_granularity_minutes,min_notice_minutes,max_per_day,buffer_before_minutes,buffer_after_minutes,location_kind,requires_approval}, slots[], coverage, unknown_windows[], horizon?, generated_at }. No auth required.

NameTypeReqDescription
fromstring–ISO-8601 start of the window to search, e.g. 2026-09-12T00:00:00Z. Defaults to now.
handlestringyesThe member's booking handle.
meeting_typestringyesThe meeting-type slug from ic_scheduling_list_meeting_types. Do not guess it.
tostring–ISO-8601 end of the window. Defaults to the member's horizon; a longer request is clamped and the horizon block says so.
tzstring–IANA zone the BOOKER is in, e.g. Europe/Berlin. Echoed as viewer_tz. An unknown zone is rejected, never silently accepted. A raw UTC offset is NOT a zone and cannot survive a DST boundary.

No output schema declared.

No examples provided.

ic_scheduling_list_meeting_types ~309

What you may book with one IC member: every PUBLIC meeting type they publish, with its duration, location kind, notice window and booking horizon. START HERE — a slug guessed rather than read is the commonest way an availability call returns not_found. NO TOKEN REQUIRED, and that is the point: a visitor's agent must be able to discover a member's booking link without an IC account, exactly as a human opening the link can. Visibility is filtered in the scheduling service's own SQL — members_only, unlisted and deactivated types never reach this response and are not filtered here, so an empty meeting_types means this member publishes nothing public, NOT that a filter hid something. min_notice_minutes and horizon_days are the two policy fields that decide whether a slot you want can exist at all; read them before proposing times to your human. The same reads are served by the scheduling service itself at https://sched.skew.site; its protocol document is https://sched.skew.site/v1/.well-known/scheduling. Args: { handle }. Returns: { ok, member:{handle,display_name,tz}, meeting_types[{slug,title,description,duration_minutes,location_kind,min_notice_minutes,horizon_days,requires_approval}] }. No auth required.

NameTypeReqDescription
handlestringyesThe member's booking handle, lowercase — the segment in their booking link. Matches ^[a-z0-9][a-z0-9._-]{0,63}$.

No output schema declared.

No examples provided.

ic_scheduling_manage_booking ~652

The way OUT of a booking, and it is first-class on purpose: an agent that has to ask its human to click a link in an email simply ghosts, and no-shows are the failure mode that actually burns members' time. NO TOKEN REQUIRED — the booking's own cancel_token IS the credential, exactly as a form's claim token is for an account-less submitter. Putting the exit behind an IC account nobody was issued is how a person ends up emailing a human to be removed. Authorization has not been skipped, it has MOVED into the resource: the token is checked in constant time and a WRONG token gives the SAME answer as a missing booking (not_found), so this cannot be used to discover which booking ids exist. action:read returns the booking's current state. action:cancel is idempotent — cancelling an already-cancelled booking is a SUCCESS, not an error, so a retry after a dropped response does not look like a failure. action:reschedule NEEDS start. A refused move leaves the original booking untouched: the release and the new booking are one transaction, so an error means nothing changed and you may try another slot. Confirm cancel and reschedule with your human first; both are visible to the member immediately. booking.id in a reschedule response is NEW and is the one to keep; cancel_token is unchanged. Reading the OLD id with the same token returns the LIVE booking (booking.id is the new id) plus superseded{id,start,end,rescheduled_by} naming the booking you asked for, so a saved manage link keeps working after the owner moves the meeting. Args: { booking_id, cancel_token, action, start?, reason?, idempotency_key? }. Returns: { ok, booking{id,status,start,end,cancel_token,cancelled_by,rescheduled_by,rescheduled_to}, superseded?{id,start,end,rescheduled_by}, member, meeting_type, location_url, ics, calendar{status} } or { ok:false, error_kind } from not_found | slot_taken | outside_window | too_soon | rate_limited | validation | transient. No auth required.

NameTypeReqDescription
actionstringyesread is safe and repeatable. cancel and reschedule change a real person's calendar — confirm with your human first.
booking_idstringyesThe booking's id, from the confirm response's booking.id.
cancel_tokenstringyesFrom booking.cancel_token on the confirm response, or the manage link inside the .ics your human saved. It is the only credential for this booking.
idempotency_keystring–8-128 chars of [A-Za-z0-9._:-]. Required by the service on a reschedule; minted here if you omit it. Bring your own and reuse it on retry.
reasonstring–Optional, for action:cancel. The member sees it; it is the difference between a cancellation and a ghosting.
startstring–Required for action:reschedule. An ISO-8601 slot start from a FRESH ic_scheduling_get_availability call — the old response is stale the moment anyone else books.

No output schema declared.

No examples provided.

ic_signal_get_issue ~79

Fetch one issue by slug. Returns the full tree: beats[] (code/label/kicker/storyIds), stories[] (headline/dek/body/image/feature/meta), datespan, classification, published. No auth required. Args: { slug: string (e.g. "issue-05") }.

NameTypeReqDescription
slugstringyes–

No output schema declared.

No examples provided.

ic_signal_get_latest ~93

Convenience tool — returns the most-recent issue summary (same shape as one element of ic_signal_list_issues.issues[]). No auth required. Args: { include_stories?: boolean (default false — when true the issue's story list is inlined as stories[] with id/title/dek, saving a follow-up ic_signal_get_issue round trip) }.

NameTypeReqDescription
include_storiesboolean––

No output schema declared.

No examples provided.

ic_signal_get_story ~101

Fetch one story by (issue slug, story id). The story id is the kebab-case slug stored on each story (e.g. "grok-build", "shai-hulud-2"). Returns the story tree including body paragraphs, feature card, image, and source citations. No auth required. Args: { slug: string, story_id: string }.

NameTypeReqDescription
slugstringyes–
story_idstringyes–

No output schema declared.

No examples provided.

ic_signal_list_issues ~97

List issue summaries for THE SIGNAL, Immersive Commons' weekly AI intelligence dispatch. Newest first. No auth required. Args: { limit?: number (max 50, default 10) }. Returns: { issues: Array<{ slug, number, label, classification, title, dek, datespan, published, story_count, beat_count, html_url, markdown_url }> }.

NameTypeReqDescription
limitinteger––

No output schema declared.

No examples provided.

ic_signal_search ~105

Substring search across every published SIGNAL issue. Matches on issue title + dek, beat label + kicker, story headline + dek + body. Case-insensitive. Returns ranked hits with a snippet + the slug + (when matched in a story) story_id. No auth required. Args: { q: string (2-120 chars), limit?: number (max 50, default 10) }.

NameTypeReqDescription
limitinteger––
qstringyes–

No output schema declared.

No examples provided.

ic_spatial_beta_apply ~528

Submit an application to the 50-person spatial-computing beta. WRITES a real application under a real person's name and commits them to a 5-week in-person NDA-bound program, so CONFIRM EVERY ANSWER WITH YOUR HUMAN FIRST and never invent one on their behalf - particularly the NDA, commitment and in-person answers, which are promises they have to keep. Call ic_spatial_beta_program first for the catalog and the exact allowed values. One application per email address; a second is refused rather than silently merged. The response carries a `claim_token` shown EXACTLY ONCE: surface it to your human verbatim, because without it an applicant with no IC account can never read their own status again. No auth required; a token only attributes the application. Returns: { ok, application_id, claim_token, status, failed_gates, cohort, message }.

NameTypeReqDescription
accessibilitystring–Access needs or anything affecting headset use. Optional, accommodated, never used to screen anyone out.
anything_elsestring–Anything else. Optional.
availabilitystringyesExactly one of: Weekday daytime | Weekday evenings | Weekends | Flexible / most times. Required.
building_nowstringyesWhat they are building right now, in their own words. Required.
commit_5_weeksbooleanyesCan they commit to the full 5 weeks? Required.
emailstringyesEmail they actually read. Required.
full_namestringyesApplicant's full name. Required.
handlestring–Telegram or X handle. Optional.
heard_viastring–How they heard about it. Optional.
in_person_sfbooleanyesCan they get to Frontier Tower, San Francisco in person regularly? Required. The hardware never leaves the building.
nda_ackbooleanyesWill they sign the strict NDA before their first session? Required. A false is honest and is recorded as a failed gate rather than blocked.
profilestringyesExactly one of: AI founder | Prompt engineer | Computational designer | Vibe coder | Spatial UI/UX tinkerer | XR developer | Researcher | Other. Required.
project_linkstring–https URL to a project, GitHub or portfolio. Optional.
xr_experiencestringyesExactly one of: None - total newcomer | Tried a few times | Regular user | I build for headsets. Required. Newcomers are WANTED - do not inflate this to make an application look stronger.

No output schema declared.

No examples provided.

ic_spatial_beta_program ~177

Everything needed to apply to the Immersive Commons spatial-computing beta: the terms (50 testers, 5 weeks, $160 paid ON COMPLETION, in person at Frontier Tower San Francisco, strict NDA, a pre-release AI spatial-computing device 6-12 months from release), every application question, and the REASON each is asked. Call this BEFORE ic_spatial_beta_apply so you answer well instead of guessing. `gates` names the three booleans that decide most applications - the NDA, the 5-week commitment, and being able to attend in person; a no to any of them is very likely a rejection, and saying so honestly beats applying anyway. Args: none. Returns: { ok, form, cohort: { size, approved, remaining } }. No auth required.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

ic_spatial_beta_status ~139

Where one application stands. Needs BOTH the application_id and the claim_token returned at submission: an id alone returns only public slot counts and never anyone's record, because ids travel through URLs and chat logs and must not work as credentials. A wrong or missing token is answered exactly like an unknown id, so this cannot be used to test whether an id exists. Args: { application_id, claim_token }. Returns: { ok, found, application?, cohort }. No auth required.

NameTypeReqDescription
application_idstringyesThe sb_ id returned at submission.
claim_tokenstringyesThe sbc_ token returned once at submission.

No output schema declared.

No examples provided.

Common questions

What is the Immersive Commons MCP server?

Immersive Commons is an MCP server listed in the public MCP registry as com.immersivecommons/floor10. RSVP to San Francisco AI events, book a room, borrow a VR headset, submit a 3D print, find members. This page covers its hosted endpoint (https://www.immersivecommons.com/api/mcp).

Is the Immersive Commons MCP server safe to use?

Immersive Commons scores 68 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Immersive Commons MCP server expose?

Immersive Commons exposes 22 tools: ic_signal_list_issues, ic_signal_get_latest, ic_donate, ic_donations_total, ic_signal_get_issue, and 17 more. Their descriptions and schemas cost roughly 5,814 tokens of context every time the server is loaded.

Does the Immersive Commons MCP server require authentication?

No. We connected to Immersive Commons without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Immersive Commons MCP server still maintained?

Immersive Commons is still listed as active in the MCP registry. We last reached this channel on 28 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.