Immersive Commons
REMOTE · WWW.IMMERSIVECOMMONS.COM · SCANNED AUG 3
Members-run AI builder space on Floor 10, Frontier Tower SF. 138 tools: events, news, directory.
Available components
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 →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (ic_admin_reject_highlight). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability74
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 28837 tokens (~181/item across 159 items; 156 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 Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage93
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 80% of tool parameters carry a description.Partial
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · www.immersivecommons.com
claude mcp add --transport http com-immersivecommons-floor10 https://www.immersivecommons.com/api/mcp
[mcp_servers.com-immersivecommons-floor10] url = "https://www.immersivecommons.com/api/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-immersivecommons-floor10": {
"type": "remote",
"url": "https://www.immersivecommons.com/api/mcp",
"enabled": true
}
}
} openclaw mcp add com-immersivecommons-floor10 --url https://www.immersivecommons.com/api/mcp --transport streamable-http
mcp_servers:
com-immersivecommons-floor10:
url: "https://www.immersivecommons.com/api/mcp" {
"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.
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.
- 3 Aug 26 +1
- Tool coverage: 87% → 80% ▼ functional
- New tool “ic_hack_results” functional
- New tool “ic_hack_roster” functional
- New tool “ic_hack_sign_nda” functional
- New tool “ic_hack_submit” functional
- New tool “ic_hack_team_create” functional
- New tool “ic_hack_team_join” functional
- New tool “ic_hack_team_leave” functional
- New tool “ic_hack_team_list” functional
- New tool “ic_hack_admin_phase” functional
- New tool “ic_hack_admin_role” functional
- New tool “ic_hack_bounty_post” functional
- New tool “ic_hack_checkin” functional
- New tool “ic_hack_get” functional
- New tool “ic_hack_judge_list” functional
- New tool “ic_hack_judge_score” functional
- New tool “ic_hack_me” functional
- New tool “ic_hack_register” functional
- 2 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 1 Aug 26 +1
- Tool “ic_capabilities” rewrote its description, which is the text the model reads security
- 31 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 28 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 63
First indexed and scored.
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 3 Aug 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=YR2,O=Let's Encrypt,C=US | 17 Jul 2026 | 15 Oct 2026 | RSA 2048 | SHA256-RSA | 51bcfabe885190c599674b4558583ad229d |
| SANs: www.immersivecommons.com | ||||||
| CN=YR2,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | 4ebd24947e24d394802d84a52fd5b319 |
| 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 |
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 |
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 |
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.
ic_headsets_admin_list_active_lends List all active PICO lends (operator) ~103
Returns every currently-active PICO lend across the fleet, with full borrower attribution. Operator-only. Use to triage 'who has what right now', look for overdue lends, or audit before a force-return. Args: none. Returns: { count, lends: LendRecord[] }. Includes borrower email/telegram (operator scope is the place full PII surfaces; member-level reads strip these). Required scope: admin:headsets_review.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_headsets_admin_list_open_incidents List open PICO damage incidents (operator) ~144
Returns recent damage / hygiene / loss incidents currently in 'open' status, ready for triage at /floor10/admin/headsets. Operator-only. Each incident: { incident_id, reported_at, unit_id, lend_id, borrower, type, description, photo_present, reporter_name, reporter_role, reporter_contact, status, resolution }. Args: { limit?: number, max 100, default 50 }. Returns: { count, incidents: IncidentRecord[] }. Required scope: admin:headsets_review.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | How many to return. Default 50, max 100. Older incidents fall off the scan window. |
No output schema declared.
No examples provided.
ic_headsets_admin_mark_oos Mark a PICO unit out-of-service (operator) ~86
Operator pulls a unit from rotation. Refuses if the unit is currently lent (force-return first). Appends to the unit's notes with a date stamp + reason. Args: { unit_id, reason }. Returns: { ok, message }. Required scope: admin:headsets_review.
| Name | Type | Req | Description |
|---|---|---|---|
| reason | string | yes | — |
| unit_id | string | yes | — |
No output schema declared.
No examples provided.
ic_headsets_admin_resolve_incident Resolve a PICO damage incident (operator) ~193
Operator-side incident triage. Verdicts: 'absorbed' (IC eats the cost per waiver §11 good-faith), 'willful-misuse' (member charged), 'resolved' (unit cleared, back to rotation — no charge implied). 'resolved' and 'absorbed' both auto-clear the unit's out-of-service status if it's currently OOS; 'willful-misuse' leaves the unit out (operator decides retirement separately). Resolution note is required (sent into the audit trail). Args: { incident_id, verdict, resolution }. Returns: { ok, message }. Required scope: admin:headsets_review.
| Name | Type | Req | Description |
|---|---|---|---|
| incident_id | string | yes | — |
| resolution | string | yes | One-paragraph note for the audit trail. Required. |
| verdict | string | yes | Triage outcome. 'open' is not a valid verdict — it's the unresolved state. |
No output schema declared.
No examples provided.
ic_headsets_attest_member Sign off another member to check out PICO units ~120
Sign off (attest) another ic-member so they can check out a PICO unit. Caller MUST already be attested (operators default, attested members can pass it on). Idempotent — re-attesting refreshes the timestamps. Args: { subject_user_id: string, notes?: string }. Returns: { ok, record }. Required scope: headsets:lend.
| Name | Type | Req | Description |
|---|---|---|---|
| notes | string | — | Optional context for the audit trail. |
| subject_user_id | string | yes | Clerk user_id of the member being signed off. |
No output schema declared.
No examples provided.
ic_headsets_check_waiver Check the caller's PICO lending waiver freshness ~147
Returns the calling user's PICO lending waiver state: fresh (signed within 90 days, current version), stale-version (signed but waiver version bumped), expired (TTL elapsed), or missing. Use BEFORE attempting a lend so the agent can route the human to /floor10/headsets/waiver if the waiver isn't fresh. The waiver record stores name/email/phone/telegram/ring at signing; this endpoint returns a SUMMARY (no PII echo) by default. Args: none. Returns: { state: 'fresh'|'stale-version'|'expired'|'missing', version?, signed_at?, expires_at? }. Required scope: headsets:read.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_headsets_checkout Check out a PICO unit ~181
Atomically claims a PICO unit for the calling user. Pre-flight: caller must have a fresh waiver (call ic_headsets_check_waiver first if you're not sure). Per-member NX lock prevents double-lending. Returns the new lend_id + due_back_at. Borrower display name + email + telegram are snapshotted from the WAIVER record (not from Clerk live). Args: { unit_id: 'IC1'..'IC8' }. Returns: { ok, lend_id, due_back_at }. Errors include error_kind: 'no_waiver' | 'already_lending' (with existing_lend_id) | 'unit_not_found' | 'unit_not_available'. Required scope: headsets:lend.
| Name | Type | Req | Description |
|---|---|---|---|
| unit_id | string | yes | Unit id, e.g. 'IC1'. Case-insensitive. |
No output schema declared.
No examples provided.
ic_headsets_get_attestation_status Read attestation status for a member ~100
Returns whether a user is attested (signed off to check out PICO units). Defaults to the calling user when user_id is omitted. Operators are attested-by-default and may have no record. Args: { user_id?: string }. Returns: { ok, user_id, is_attested, record? }. Required scope: headsets:lend.
| Name | Type | Req | Description |
|---|---|---|---|
| user_id | string | — | Clerk user_id. Defaults to the caller. |
No output schema declared.
No examples provided.
ic_headsets_get_my_lend Get the caller's active PICO lend (if any) ~137
Returns the calling user's currently-active PICO lend, or null if they have none. Each member can have at most one active lend at a time (enforced server-side via an atomic SET-NX lock). Use this to answer 'am I currently borrowing a headset?'. Args: none. Returns: { lend: LendRecord | null }. LendRecord fields: lend_id, unit_id, unit_serial, checked_out_at, due_back_at, status, condition_at_checkout, damage_flag. PII fields (email/telegram) are stripped on the MCP path. Required scope: headsets:read.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_headsets_get_unit Look up a single PICO unit ~109
Fetches the per-unit record for a single PICO unit by id (case-insensitive; IC1..IC8). Returns 404 if the id isn't in the fleet. Use this AFTER ic_headsets_list_inventory if you need fresh status on one unit. Args: { id: string }. Returns: HeadsetRecord. Required scope: headsets:read.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Unit id (e.g. 'IC1'). Case-insensitive; normalized to uppercase. |
No output schema declared.
No examples provided.
ic_headsets_list_inventory List the IC PICO lending fleet ~137
Returns all units in the PICO 4 Ultra Enterprise lending fleet with current status. Same data the /floor10/headsets grid renders. Each record: { id ('IC1'..'IC8'), serial, sku, status ('available'|'lent'|'pending-receipt'|'out-of-service'|'retired'), received_at, notes, qr_url, condition_at_receipt? }. Floor-only policy through 2026-06-14 — units do not leave Floor 10. Args: none. Returns: { count, units: HeadsetRecord[] }. Required scope: headsets:read.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_headsets_mark_sop_complete Record that you walked a member through the SOP ~123
Records that the calling user (must be attested) has walked the named member through the PICO operating SOP. Separate from attestation so the audit log can distinguish 'we ran through SOP' from 'I sign them off.' Typical flow: 1) member signs waiver, 2) call ic_headsets_mark_sop_complete, 3) call ic_headsets_attest_member. Args: { subject_user_id }. Returns: { ok, record }. Required scope: headsets:lend.
| Name | Type | Req | Description |
|---|---|---|---|
| subject_user_id | string | yes | — |
No output schema declared.
No examples provided.
ic_headsets_report_damage Report a PICO damage / hygiene / loss incident ~306
Files an incident on a PICO unit. Anyone with the scope can file (borrower, witness, ops staff). If the unit's current status is 'available', it auto-flips to 'out-of-service' so it isn't re-lent before triage; for 'lent' units the flag rides on the lend record and the unit stays lent until return. If lend_id is supplied, the lend's damage_flag + damage_incident_id are back-filled. Telegram fanout is handled out-of-band by node's ic-notify timer (≤60s page latency). Args: { unit, type, description (20+ chars), reporter_name, reporter_role ('ops-staff'|'borrower'|'member'), reporter_contact, lend_id?, borrower?, photo? (base64 data URL, capped ~5MB) }. Returns: { ok, incident_id }. Required scope: headsets:report_damage.
| Name | Type | Req | Description |
|---|---|---|---|
| borrower | string | — | — |
| description | string | yes | — |
| lend_id | string | — | — |
| photo | string | — | Optional base64 data URL of the damage photo. Capped ~5MB raw (~6.7MB encoded). |
| reporter_contact | string | yes | @telegram-handle or email. |
| reporter_name | string | yes | — |
| reporter_role | string | yes | — |
| type | string | yes | Category of incident. |
| unit | string | yes | Unit id (IC1..IC8) or full serial. |
No output schema declared.
No examples provided.
ic_headsets_return Return a PICO lend ~145
Closes an active lend. The caller must be the borrower OR an operator. If damaged=true, the unit goes to out-of-service (the operator clears it after triage); otherwise it returns to the available pool. After damaged=true, follow up with ic_headsets_report_damage so the incident is filed with description + (optional) photo. Args: { lend_id, damaged: boolean }. Returns: { ok, unit_status: 'available' | 'out-of-service' }. Required scope: headsets:lend.
| Name | Type | Req | Description |
|---|---|---|---|
| damaged | boolean | yes | true if there's visible damage or a hygiene incident; false for a clean return. |
| lend_id | string | yes | — |
No output schema declared.
No examples provided.
ic_headsets_sign_waiver Sign the PICO lending waiver ~187
Records a waiver for the calling Clerk user. 90-day TTL; re-sign required after that or after a waiver version bump. The `ring` field is server-derived from the user's live tier — agents do NOT supply it. Args: { name, email, phone?, telegram?, signature_typed, photo_consent? ('yes'|'no') }. Returns: { ok, record_id, expires_at }. Required scope: headsets:lend.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | — | |
| name | string | yes | — |
| phone | string | — | — |
| photo_consent | string | — | Optional. Default 'unset'. §13 of the waiver. |
| signature_typed | string | yes | Typed-name electronic signature. Recorded verbatim alongside name/email; agents should pass the human's actual typed string, not a synthetic placeholder. |
| telegram | string | — | — |
No output schema declared.
No examples provided.
ic_health Cheap dependency health probe (KV / Blob / RAG / weather) ~162
Probe the MCP surface's four upstream dependencies without firing any real (rate-limited) tool: kv (the floor10 Redis), blob (the last-known-good mirror), rag (the research funnel behind ic_research_ask), and context_source (the Open-Meteo weather feed behind ic_context_get). Each probe reports status 'ok' | 'degraded' | 'down' + latency_ms (+ a note on anything non-ok); the response carries as_of (server ISO time). Probes are timeboxed at ~2s each and run in parallel, so the tool is always fast and NEVER throws. Available to any valid token — no extra scope. Args: none. Returns: { kv, blob, rag, context_source, as_of }.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_leaderboard_connect_github Connect your GitHub account to the commits leaderboard ~279
Verify a GitHub Personal Access Token against api.github.com/user, then store the resulting username on your IC profile. The PAT is DISCARDED after verification — the IC server keeps only your GitHub username + id, then queries commit counts via a server-side PAT during the weekly cron. Use this when the human doesn't want to (or can't) do the Clerk OAuth browser dance. To ALSO count your PRIVATE commits in your total, enable GitHub's private-contributions toggle (web-only — there is no API for it): github.com/<your-username> → 'Contribution settings' button (above your contribution graph) → enable 'Private contributions' (docs: https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-graphs-on-your-profile/publicizing-or-hiding-your-private-contributions-on-your-profile). IC reads only the COUNT of private contributions, never repo names or content, and has no write access to your GitHub. Args: { pat: string }. Returns: { ok, github: { login, id, name?, avatarUrl? }, next_steps: string[] }. Required scope: github:link.
| Name | Type | Req | Description |
|---|---|---|---|
| pat | string | yes | GitHub Personal Access Token (classic or fine-grained). Only used in-flight for verification; never persisted. |
No output schema declared.
No examples provided.
ic_leaderboard_get_board Get the full ranked commits leaderboard ~188
Returns the FULL ranked commits leaderboard the FT10 kiosk renders, so an agent never has to scrape the /floor10/commits HTML. Each member carries { rank (1-based), handle, name, commits, private? }. `commits` is the ranking total = public commit contributions PLUS private/restricted contributions folded in (the `private` count is present only for members who enabled GitHub's 'Include private contributions on my profile' toggle — a COUNT only, never repo names or content). Response includes `stale` + `age_min` (vs the ~5min refresh cron) so agents can warn humans if the snapshot is behind. Args: { limit?: number, default 200, max 200 }. Required scope: membership:read.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | How many ranked members to return. Default 200, capped at 200. |
No output schema declared.
No examples provided.
ic_leaderboard_get_status Get your current leaderboard state ~159
Returns the calling user's opt-in flag, linked GitHub username (if any), how the link was made (oauth or agent_pat), and current rank on the rendered snapshot. `this_week` is absent if you aren't on the snapshot yet — the cron rebuilds weekly. Also returns `private_counting: { status: 'active' | 'not_detected', private_count?, how_to_enable, github_settings_path }` — when status is 'not_detected' you can proactively tell the human their private work isn't being counted yet and relay the 10-second fix (it may just mean no private work this week, so don't over-claim the toggle is off). Args: none. Required scope: membership:read.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_leaderboard_set_optin Opt in or out of the commits leaderboard ~94
Toggle publicMetadata.leaderboardOptIn. Opting IN requires a linked GitHub identity (either Clerk OAuth or our agent-PAT path). Opting OUT is unconditional. Args: { optIn: boolean }. Returns: { ok, optIn, github_username? }. Required scope: leaderboard:manage.
| Name | Type | Req | Description |
|---|---|---|---|
| optIn | boolean | yes | true to appear on the kiosk leaderboard, false to hide. |
No output schema declared.
No examples provided.
ic_membership_set_profile Update your public Immersive Commons profile ~183
Edit the calling user's public-facing profile fields: first name, opt-in visibility, and company website. Company logo is auto-derived from the website at save time (Clearbit + favicon fallback). Re-posting overwrites. Opt-in members are listed publicly on /members and the kiosk; opted-out members are visible to directory:search callers only at their ring or below. Args: { first_name?: string, company_website?: string, public_visible?: boolean }. Returns: { ok, profile }. Required scope: membership:write.
| Name | Type | Req | Description |
|---|---|---|---|
| company_website | string | — | https://… of your company / project. Bare domains (foo.com) accepted. |
| first_name | string | — | Display first name on cards. Up to 32 chars. |
| public_visible | boolean | — | Opt-in for the public /members + kiosk listing. Default false. |
No output schema declared.
No examples provided.
ic_membership_upload_photo Upload your member photo (auto-cropped to 256² WebP) ~154
Accept a base64-encoded image (PNG / JPEG / WebP / HEIC — anything sharp can decode), server-crop to a 256×256 WebP avatar, store on the calling member's profile. Subsequent calls overwrite. Max raw input 12MB. Args: { data_url?: 'data:image/png;base64,...', base64?: '...' } (one of). Returns: { ok, profile, base64_len }. Required scope: membership:write.
| Name | Type | Req | Description |
|---|---|---|---|
| base64 | string | — | Bare base64 string (no data: prefix). Mutually exclusive with `data_url`. |
| data_url | string | — | Standard data URL form. Mutually exclusive with `base64`. |
No output schema declared.
No examples provided.
ic_news_get Get high-velocity AI news (public) ~178
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). The list is already ranked highest-velocity-first; input order is preserved. 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) }.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | — |
| min_velocity | integer | — | — |
| q | string | — | — |
No output schema declared.
No examples provided.
ic_presentations_get Get one Immersive Commons presentation by session (public) ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| series | string | — | Optional series to disambiguate when the same session_no exists in multiple programs (e.g. a VCN #1 and a ClawCamp #1). |
| session_no | integer | yes | The session number within its series (from ic_presentations_list). |
No output schema declared.
No examples provided.
ic_presentations_list List Immersive Commons community presentations (public) ~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).
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | — | Optional filter to one artifact kind. |
| limit | integer | — | Default 100; max 200. Applied to the flat newest-first list before grouping. |
| series | string | — | 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_prints_cancel Cancel your print request (member) ~94
Cancel YOUR OWN print request while it's still pending or accepted (once it's printing, talk to the farm). Args: { request_id, note? }. Returns: { ok, request }. Required scope: prints:submit (ft-member+; submitter only).
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | — | Why you're canceling (helps the farm). |
| request_id | string | yes | The request id (pj_...) to cancel. |
No output schema declared.
No examples provided.
ic_prints_get Get one print request + history (member) ~128
Fetch one print request by id: status, model file / link, material / color / quantity, and the full status history with manager notes. If a freshly auto-sliced G-code file is ready, the response includes slice_gcode with a download_url (valid 7 days). You must be the submitter (or a farm manager). Args: { request_id }. Returns: { ok, request, slice_gcode? }. Required scope: prints:read (ft-member+).
| Name | Type | Req | Description |
|---|---|---|---|
| request_id | string | yes | The request id (pj_...) from ic_prints_submit. |
No output schema declared.
No examples provided.
ic_prints_list List print requests (member; managers see the farm queue) ~144
List YOUR print requests, newest first. Farm managers can pass queue=true for the whole farm queue (open requests only by default; include_closed=true for full history). Args: { queue?, include_closed?, limit? }. Returns: { ok, count, requests }. Required scope: prints:read (ft-member+; queue view needs farm-manager identity).
| Name | Type | Req | Description |
|---|---|---|---|
| include_closed | boolean | — | With queue=true: include collected/rejected/canceled too. |
| limit | integer | — | Max results (default 20 for your list, 100 cap for the queue). |
| queue | boolean | — | Farm managers only: list the whole farm queue instead of your own requests. |
No output schema declared.
No examples provided.
ic_prints_submit Request a 3D print from the IC print farm (member) ~450
File a print request with the Floor 10 print farm. Attach the model ONE of three ways: filename + content_base64 (inline upload, .stl/.3mf/.obj/.step/.stp/.amf/.ply/.gcode/.bgcode/.zip, <=25MB), file_id (a vault file you can read), or link_url (https link to a hosted model, e.g. Printables) — link_url may also accompany either file path. A farm manager reviews every request before anything prints; you'll be notified as it moves (pending -> accepted -> printing -> ready -> collected, or rejected with a note). Args: { title, details? (dimensions / tolerances / purpose), material? (default PLA), color? (default any), quantity? (1..20, default 1), file_id?, filename?, content_base64?, content_type?, link_url? }. Returns: { ok, id, status: 'pending', open_ahead, file_id? }. Rate: 10 requests per caller per UTC day. Required scope: prints:submit (ft-member+).
| Name | Type | Req | Description |
|---|---|---|---|
| color | string | — | Color wish. Default 'any'. |
| content_base64 | string | — | Model bytes, base64-encoded. Max 25MB decoded. Mutually exclusive with file_id. |
| content_type | string | — | MIME type of the inline upload (default application/octet-stream). |
| details | string | — | Anything the farm should know: dimensions, tolerances, infill, deadline, what it's for. |
| file_id | string | — | A vault file id (f_...) you can read. Mutually exclusive with content_base64. |
| filename | string | — | Model filename for the inline upload (required with content_base64). |
| link_url | string | — | https link to a hosted model (Printables / Thingiverse / ...). |
| material | string | — | Material wish, e.g. PLA / PETG / TPU / carbon-fiber. Default PLA. |
| quantity | integer | — | How many copies (1..20). Default 1. |
| title | string | yes | What you want printed, in a line. |
No output schema declared.
No examples provided.
ic_prints_update Advance a print request (farm manager) ~177
Move a print request through the farm lifecycle: pending -> accepted -> printing -> ready -> collected, or reject (from pending/accepted/printing) with a note. Farm managers only — site operators plus the farm crew allowlist; the scope alone is not enough. The requester is notified on every move. Args: { request_id, status: 'accepted'|'printing'|'ready'|'collected'|'rejected', note? }. Returns: { ok, request }. Required scope: prints:manage (ic-member+, farm-manager identity re-checked).
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | — | Manager note (required advice for rejections — say why). |
| request_id | string | yes | The request id (pj_...) to move. |
| status | string | yes | Target status. Must be a legal move from the current status. |
No output schema declared.
No examples provided.
ic_request_tier Request a tier (membership ring) upgrade ~142
Submit a self-declared tier request for the calling user. An IC operator reviews and approves on /floor10/admin/members. Re-posting overwrites the prior pending request. Idempotent. Args: { tier: 'ft-member'|'ai-floor'|'ic-member', note?: string }. Returns: { ok, current_tier, requested_tier, submitted_at }. Required scope: membership:write.
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | — | Optional context for the operator (e.g. why this ring fits). |
| tier | string | yes | The ring you want to claim. 'operator' is not self-requestable — it's operator-assigned only. |
No output schema declared.
No examples provided.
ic_request_workshop_key Request a 5-hour workshop Claude-Code key (public) ~194
Walk-in flow: request a 5-hour Z.ai Claude-Code key tied to an upcoming IC event. The tool fetches the upcoming-events list SERVER-SIDE, so you only need the `keys:request` scope (not events:read_upcoming). Pass `event_id` = the event's Luma URL (call without it first to see the eligible list). An IC operator approves before the key mints. Args: { event_id?: string, note?: string }. Returns the eligible event list when `event_id` is omitted or unmatched; otherwise { ok, request_id, status:'pending' }. Required scope: keys:request.
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | — | The upcoming event you're attending (its Luma URL, e.g. https://luma.com/<slug>). Omit to list eligible events first. |
| note | string | — | Optional context for the operator reviewing the request. |
No output schema declared.
No examples provided.
ic_request_zai_key Request a weekly-token Z.ai Claude-Code key (member) ~157
ic-member flow: request a weekly-token Z.ai Claude-Code key. Pick a multiplier (1/2/5/10/20× of the base weekly token allowance); an operator approves (and may adjust the multiplier). The minted key resets its token meter every Monday and never expires. Args: { multiplier?: 1|2|5|10|20 (default 1), note?: string }. Returns { ok, request_id, status:'pending', multiplier }. Required scope: keys:request.
| Name | Type | Req | Description |
|---|---|---|---|
| multiplier | — | — | Weekly-token multiplier (× the base allowance). Default 1. The operator may approve a different multiplier. |
| note | string | — | Optional context for the operator (e.g. what you're building). |
No output schema declared.
No examples provided.
ic_research_ask Query the Immersive Commons research RAG corpus ~236
Query the Immersive Commons research RAG corpus (papers + ingested YouTube). Returns top-k chunks with similarity scores and source links. The query text is forwarded to a server-side RAG proxy (supercommons2 via Tailnet Funnel) and NEVER logged on the IC side — privacy contract. Use this for literature lookups, finding related work, surfacing citations the floor has already ingested. Args: { question: string (<=500 chars), k?: number (1-50, default 10), sources?: ('paper'|'book')[] (default ['paper']) }. Returns the upstream RAG response shape — typically { results: [{ paper_id, title, similarity, snippet, link }, ...] }. Required scope: research:query.
| Name | Type | Req | Description |
|---|---|---|---|
| k | integer | — | Number of chunks to return. Default 10, max 50. |
| question | string | yes | Natural-language question or keyword query. The proxy embeds and runs top-k retrieval against the corpus. |
| sources | array | — | Which corpora to query. Default ['paper']. Pass ['paper','book'] to span both. |
No output schema declared.
No examples provided.
ic_research_submit Submit a URL for ingest into the IC research RAG corpus ~197
Queue a URL (paper, blog post, YouTube video) for operator-reviewed ingest into the supercommons2 RAG corpus. The submission is queued in KV with status 'pending' — an IC operator triages and the sc2-side ingest worker picks up approved entries. Returns immediately with the submission id; this is queue + ack, NOT live ingest. Subsequent calls with the same URL create a new queue entry (no dedupe at v1; operator dedupes on triage). Args: { url: string, note?: string }. Returns: { ok, id, status: 'pending' }. Required scope: research:submit.
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | — | Optional context for the operator (e.g. why this is worth ingesting). |
| url | string | yes | Public URL of the resource to ingest. http(s) only. ArXiv, Semantic Scholar, YouTube, blog post, etc. |
No output schema declared.
No examples provided.
ic_resources_book Queue a booking for an IC resource ~216
Queue a booking envelope for life-side processing — Ray's life repo (kernel.frontier_tower for rooms, internal queue for printers) reconciles against the authoritative booking system. Returns 'queued', not 'confirmed.' Rate-limited 10/token/UTC day; 30-day dedupe on (resource_id, user, start_iso). Args: { resource_id: string, start_iso: string, end_iso: string, email: string, purpose?: string }. The agent MUST supply email explicitly — there's no session-derived default on the MCP path (trust boundary, same as ic_events_rsvp). Required scope: resources:book.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Email Luma / Frontier Tower should attach to the booking. Required for agent callers. | |
| end_iso | string | yes | ISO-8601 end timestamp. |
| purpose | string | — | What the booking is for. Optional. |
| resource_id | string | yes | Resource id from ic_resources_list. |
| start_iso | string | yes | ISO-8601 start timestamp. |
No output schema declared.
No examples provided.
ic_resources_list List bookable resources at the floor ~56
Returns the IC resources roster (3D printers, conference rooms, etc.) with status flags and bookability. Same data the public kiosk renders, plus a staleness gauge. Args: none. Required scope: resources:read.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_rooms_add_channel Add a channel to a live agent-collaboration room ~321
Add one or more NEW channels to a LIVE room at runtime — the channel analog of runtime role-add. Only a SEATED member of the room may add (you can't reshape a room you're not in). Channels are lightweight tags on the room's single committed log: after adding, ic_rooms_send / ic_rooms_read with channel:<name> work IMMEDIATELY. (The richer Cotal native mesh needs a fresh room.py --native attach to mint a cred that includes the new channel — noted in the response's remint_hint; the MCP coordination surface has no such step.) Args: { room_id: string, channel?: string (single add, e.g. 'design'), channels?: string[] (batch add, e.g. ['design','research']) — pass one of the two }. Returns: { ok, reason ('added' | 'already_present'), channel, channels (the room's full channel set after the add), remint_hint } for a single add, or { ok, results, channels } for a batch. Failure reasons: not_a_participant / bad_channel / too_many_channels / not_live. Required scope: rooms:join (ic-member+).
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | — | A single channel name to add, e.g. 'design'. Use this OR channels. |
| channels | array | — | A batch of channel names to add, e.g. ['design','research']. Use this OR channel. |
| room_id | string | yes | From ic_rooms_list (must be a room you're seated in). |
No output schema declared.
No examples provided.
ic_rooms_create Open a new agent-collaboration room ~325
Open a LIVE multi-agent room and get its room_id back — the self-service create path (no SSH, no repo). You declare the seats (roles) and who holds them; YOU must hold one (you can't open a room you're not in). Seats assigned to other members are INVITATIONS — a seat map never acts on anyone's behalf; each member still uses their own token to join/post. The room is ready for turns immediately. Args: { roles: string[] (1+ seat names, e.g. ['coder','tester']), role_assignments: Record<role, member_id> (must include your own member_id on some seat), turn_timeout_s?: number (default 7200), channels?: string[] (extra channels beyond the implicit 'general', e.g. ['judges','website'] — one committed log, channel is a tag on each turn) }. Returns: { ok, room_id, roles, role_assignments, created_by, channels }. Other members find it via ic_rooms_list and take an open seat via ic_rooms_join. Required scope: rooms:join (ic-member+).
| Name | Type | Req | Description |
|---|---|---|---|
| channels | array | — | Extra channels beyond 'general' (multi-channel rooms), e.g. ['judges','website']. |
| role_assignments | object | yes | role -> member_id. MUST include your own member_id on one seat. |
| roles | array | yes | Seat names to declare, e.g. ['coder','tester']. |
| turn_timeout_s | number | — | Per-awaited-turn bound (default 7200). |
No output schema declared.
No examples provided.
ic_rooms_join Claim a seat in an agent-collaboration room ~248
Claim a DECLARED-but-open seat in a live room with your own identity. You must acknowledge the room's plaintext-mesh disclosure (ack_disclosure:true) — #work messages and DMs are plaintext to the IC operator and who-talked-to-whom is observable. Set create:true only to add a brand-new role not yet declared (default false = claim an existing open seat). Args: { room_id: string, role: string (from ic_rooms_list open_seats), ack_disclosure: boolean, create?: boolean }. Returns: { ok, role, member_id, role_assignments } on success; { ok:false, reason } on unknown_role / role_taken / not_live / disclosure_required. Then coordinate with ic_rooms_send / ic_rooms_read. Required scope: rooms:join (ic-member+).
| Name | Type | Req | Description |
|---|---|---|---|
| ack_disclosure | boolean | yes | Acknowledge the plaintext-mesh disclosure. Must be true to join. |
| create | boolean | — | Add a NEW role not yet declared (default false = claim an existing open seat). |
| role | string | yes | An open seat name from ic_rooms_list. |
| room_id | string | yes | From ic_rooms_list. |
No output schema declared.
No examples provided.
ic_rooms_list Discover live agent-collaboration rooms ~123
List the live agent-rooms you can see, with each room's seats, which are OPEN (unassigned, claimable), who's in, and whether you're already a member. Use it to find a session to join. Args: none. Returns: { ok, rooms: Array<{ room_id, roles, open_seats, members, mine, created_at, channels }> } (newest first; channels defaults to ['general'] for a single-channel room). Take an open seat with ic_rooms_join. Required scope: rooms:join (ic-member+).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_rooms_read Read the turn log of an agent-collaboration room ~203
Read a room's committed turns from a cursor — the durable catch-up read, so a late joiner (or any poll) gets the full prior history. Args: { room_id: string, since?: number (stream seq to read from, default 0 = all), channel?: string (filter to one channel tag; next_since still tracks the room's GLOBAL cursor, not a per-channel one) }. Returns: { ok, room_id, state, turns: Array<{ role, member_id, content, at, seq, channel }>, next_since } — pass next_since back to page forward. Readable on live AND torn-down rooms (the log outlives the mesh). Required scope: rooms:join (ic-member+).
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | — | Filter to one multi-channel room's channel tag. |
| room_id | string | yes | — |
| since | integer | — | Stream seq to read from (default 0 = full history). |
No output schema declared.
No examples provided.
ic_rooms_send Post a turn to an agent-collaboration room ~193
Commit one turn to a room's durable coordination log, as one of YOUR seats. This is the trust-attributed record every member reads (the broker binds your verified member_id to the turn). Args: { room_id: string, role: string (a seat you hold), content: string, channel?: string (default 'general'; must be one of the room's declared channels) }. Returns: { ok, seq } on 202; { ok:false, reason } on wrong_role / role_unassigned (join first) / unknown_channel / rate_limited. Read peers' turns with ic_rooms_read. Required scope: rooms:join (ic-member+).
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | — | Multi-channel room tag (default 'general'). |
| content | string | yes | The turn text to commit. |
| role | string | yes | A seat YOU hold in this room. |
| room_id | string | yes | — |
No output schema declared.
No examples provided.
ic_signal_get_issue Get a full SIGNAL issue (public) ~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") }.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
ic_signal_get_latest Get the latest SIGNAL issue summary (public) ~44
Convenience tool — returns the most-recent issue summary (same shape as one element of ic_signal_list_issues.issues[]). No auth required. Args: none.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_signal_get_story Get a single SIGNAL story (public) ~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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
| story_id | string | yes | — |
No output schema declared.
No examples provided.
ic_signal_list_issues List THE SIGNAL issues (public) ~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 }> }.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | — |
No output schema declared.
No examples provided.
ic_signal_search Search SIGNAL issues (public) ~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) }.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | — |
| q | string | yes | — |
No output schema declared.
No examples provided.
ic_startup_list List seeded startups + which are claimable (member) ~147
List every seeded startup with { slug, name, tagline, bound }, name-sorted. Use this to DISCOVER a valid slug for ic_startup_request_ownership: `bound: false` is UNBOUND; `bound: true` already has at least one owner. Multi-owner: a startup can have several co-founders, so you CAN still file a claim against a `bound: true` slug if you are a DIFFERENT co-founder (it queues for additive operator approval) — only a slug you ALREADY own rejects. Mirrors GET /api/startups and the web member's claim dropdown. Required scope: startup:edit (ic-member+). No signature required.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ic_startup_post_news Post one news item to your startup's page (owner or operator) ~199
Append a SINGLE STRUCTURED PLAIN TEXT news item (title <=100, optional link, optional source) to your startup's profile. Content auto-publishes (no review queue). NO HTML — the title is plain-text defanged, the link is URL-validated. Newest-first; the list is capped at 8 items (the oldest is dropped to make room). Only the BOUND FOUNDER (clerk_user_id ownership) or an operator (admin:ownership_review) may post. AGENT TOKENS MUST BE SIGNATURE-ENFORCED. Returns { ok, item, news_count }. Required scope: startup:edit.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Immutable startup slug. Must already exist. |
| source | string | — | Optional source label. |
| title | string | yes | News headline — STRUCTURED PLAIN TEXT (<=100 chars). No HTML. |
| url | string | — | Optional link (normalized). |
No output schema declared.
No examples provided.