Comprehensive Model Context Protocol server for managing Home Assistant through AI assistants.
Immersive Commons is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
RSVP to San Francisco AI events, book a room, borrow a VR headset, submit a 3D print, find members.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http immersive-commons-mcp https://www.immersivecommons.com/api/mcp
# 2 — ask your agent for something these tools do
# floor10_get_my_floor_member, ic_capabilities, ic_health and 180 more
Immersive Commons costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http immersive-commons-mcp https://www.immersivecommons.com/api/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
183 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Confirms the calling agent token is valid and returns the floor-member it's scoped to. Use as a post-mint smoke check before submitting. Args: none. Returns: { member_id, member_name, token_prefix, scopes }.
No parameter schema on file.
In-band capability matrix: every registered MCP tool with its one-line description, required scope (null = any valid token), the minimum membership tier whose users can mint a token carrying that scope, and whether THIS caller's token can reach it right now ('reachable' | 'needs_scope:<scope>'). Use it to plan before calling scope-gated tools and to tell your human exactly which tier + scopes a to
No parameter schema on file.
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
No parameter schema on file.
Introspect the calling token's per-(user, tenant) Floorcast roles on its bound floor. Returns the resolved ring + display label + the canActAs verdicts (member / floor-admin / super-admin). Resolves the SAME way the auth gate does (one shared resolver — no drift). On a token with no tied Clerk identity it returns the fail-open public shape. Read-only; no scope beyond a valid token. Args: none. Ret
No parameter schema on file.
Resolve the effective feature-module set for the calling token's bound floor, LIVE from the tenant record: effective = (available ∩ enabled) \ force_disabled, plus the resolved tier and an 'N/total' breadcrumb (e.g. 'AI tier, 8/8 features live'). FAIL-CLOSED: on a both-down outage where the tenant record is unavailable, returns { ok:false, reason:'tenant-record-unavailable' } — NEVER a synthesized
No parameter schema on file.
Floor-Admin (operator-on-this-floor) toggles a module in the floor's ENABLED set; a module must be AVAILABLE on the floor to enable. PERSISTS the tenant record (inc-6). Runs the FULL authz + availability gate first: a non-Floor-Admin, or enabling a module not available on the floor, gets { ok:false, reason:'forbidden' } (no write). A live KV write failure surfaces { ok:false, reason:'write-failed'
| Parameter | Type | Required | Notes |
|---|---|---|---|
| module | string | yes | Module id (one of the 8 enum modules). |
| enabled | boolean | yes | true to enable, false to disable. |
Super-Admin (apex flag AND operator-on-THIS-floor) sets which modules a floor is ALLOWED to enable. PERSISTS the tenant record (inc-6). Runs the FULL per-tenant super-admin gate first: a floor-admin WITHOUT the apex flag, or a super-admin on a DIFFERENT floor, gets { ok:false, reason:'forbidden' } (no write). A live KV write failure surfaces { ok:false, reason:'write-failed', error } (no 500). On
| Parameter | Type | Required | Notes |
|---|---|---|---|
| module | string | yes | Module id (one of the 8 enum modules). |
| available | boolean | yes | true to make available, false to remove. |
Floor-Admin (operator-on-this-floor) sets the declarative AI-curation policy list (ai_policies) that drives the floor's AI self-updating wall. PERSISTS the tenant record via the inc-6 writer. Runs the FULL authz gate first: a non-Floor-Admin gets { ok:false, reason:'forbidden' } (no write). A live KV write failure surfaces { ok:false, reason:'write-failed', error }. Each policy is { type: 'top_com
| Parameter | Type | Required | Notes |
|---|---|---|---|
| policies | array | yes | The AI-curation policy list to persist on this floor. |
Read-only PREVIEW of the candidate content the floor's AI-curation policies WOULD surface, assembled from the floor's REUSED intel (commits / news / highlights). Writes NOTHING. Returns a per-policy { policy, candidate } list (candidate is null when the policy has no intel). Static-tier floors and floor10 (slug-fenced) return an empty list. Args: none.
No parameter schema on file.
Manual fire of the floor's AI-curation runner: assembles a candidate per enabled policy from REUSED intel and pushes it through the inc-6 moderation primitives as 'system:ai_curation'. Non-floor10 AI floors land the candidate PENDING (operator-gated). Floor-Admin gated. Static floors return { ok:false, reason:'feature-not-available' }; floor10 is slug-fenced and ALSO denied (absolute in inc-7). De
No parameter schema on file.
Returns the count of pending highlight submissions across the full moderation queue. Useful as a 'is there a backlog?' probe before adding more. (Per-member filtering is not exposed for v1; the queue is small.) Args: none. Returns: { count }.
No parameter schema on file.
Operator review queue: every pending highlight submission with its id, member, action, event title, date, dek, and image count, so you can decide approve/reject. Excludes test fixtures + stale pointers. Pair with ic_admin_approve_highlight / ic_admin_reject_highlight. Args: { detail?: 'summary'|'full' (default 'full'; 'summary' trims each row to id/member_name/action/event_title/date) }. Scope: ad
| Parameter | Type | Required | Notes |
|---|---|---|---|
| detail | string | no | Response weight. 'full' (default) returns every review field per row; 'summary' trims each row to { id, member_name, action, event_title, date } for cheap queue triage. |
Promote a pending highlight into the live /floor10/highlights MEMBERS WIRE (dedupe-prepend, keep 4 active, spill older to archive), drop it from the queue, and write an audit entry. Idempotent: a missing or expired id returns ok:false. Scope: admin:highlights_review.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The pending highlight id to approve (the submission slug). |
Drop a pending highlight from the moderation queue with an optional reason and write an audit entry. Does not publish. Scope: admin:highlights_review.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The pending highlight id to reject (the submission slug). |
| reason | string | no | Optional moderator note, recorded in the audit log. |
POST a HighlightStory for admin review. Same shape + same validation as the REST endpoint at /api/ingest/highlights/pending. Rate limit: 3 per token per UTC day. Re-submitting the same id refreshes the pending TTL (idempotent). Hard rules: no fabricated dates / quotes / member ids; news-wire third-person dek; candids first, posters last in images[]. See https://www.immersivecommons.com/docs/agent-
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Slug pattern YYYY-MM-DD-<member-slug>-<event-slug>. Lowercase, alphanumeric + hyphens. |
| member_name | string | yes | Display name as it should appear on the card. |
| member_id | string | no | Slug from data/members.yaml. The token attributes the submission server-side regardless. |
| action | string | yes | Verb-clause completing "<member> <action> <event_title>". Lowercase. E.g. "spoke at", "hosted", "demoed at". |
| event_title | string | yes | — |
| event_url | string | no | — |
| date | string | yes | Display ("MAY 08") or ISO date. |
| dek | string | yes | News-wire third-person, 1-2 sentences. No editorial verbs. No first person. No fabricated quotes. |
| stats | array | no | Convention: RSVPS / ORGANIZATION / ROLE. |
| images | array | yes | Public URLs only (not base64). Candids first, posters / Luma covers last. Lead card cycles through these. |
| image_focals | object | no | Optional sparse map of subject focal points in [0, 1] coords (top-left origin). |
Member push of a HighlightStory to your floor's MEMBERS WIRE, routed through the floor's content policy. Default policy 'moderation_queue' ⇒ the story lands PENDING for operator approval ({ ok:true, status:'pending', id }). A 'free_push_with_retract' floor (floor10 only this increment) ⇒ the story goes straight to ACTIVE ({ ok:true, status:'active', id }) — a deliberate policy bypass of the operat
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
| member_name | string | yes | — |
| member_id | string | no | — |
| action | string | yes | — |
| event_title | string | yes | — |
| event_url | string | no | — |
| date | string | yes | — |
| dek | string | yes | — |
| stats | array | no | — |
| images | array | yes | — |
| image_focals | object | no | — |
Member retract of your OWN still-pending highlight from your floor's queue (you cannot retract an already-approved/active item via this verb — that needs an operator). Routed through the floor content policy; the gate is server-side (ownership-checked). CONSEQUENTIAL. Returns { ok:true, id } on success; typed refusals { ok:false, reason } where reason is 'forbidden' (not your submission), 'not-fou
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The pending highlight id to retract. |
Returns the list of events this floor member recently attended (or was invited to as a host) — the auto-discovery layer. Use this BEFORE asking the human 'what event did you go to?'; show them this list and let them pick. Source: graph.yaml attendance ingest, enriched with canonical URLs from data/events.yaml. Args: { status_filter? (e.g. ['checked_in','attended']), limit? (default 25, max 100) }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| status_filter | array | no | Optional. Filter to one or more statuses. E.g. ["checked_in","attended"] for "really went". Default: all statuses (incl. "invited" so hosts see their own events). |
| limit | integer | no | Default 25; max 100. |
Re-hosts an image so its URL is suitable for the images array of a HighlightStory. Pass url (recommended; server fetches + stores) or data_url (small files only, RFC 2397 inline base64). Storage is content-addressed at floor10/highlights/<member_id>/<sha256>.<ext> on Vercel Blob, public-readable, year-long cache. Idempotent: same bytes -> same URL. Rate limit: 30 uploads / token / UTC day (s
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | no | Public URL of an image to fetch and re-host. Recommended path. http(s) only; localhost / cloud-metadata addresses are blocked. |
| data_url | string | no | Inline data URL ("data:image/jpeg;base64,..."). Use for screenshots / small captures the agent generated locally. Capped at the same 8 MB ceiling; base64 has ~33% overhead so practical max is ~6 MB of |
Server-side WebFetch of an event page (Luma is the canonical case; LinkedIn / X / generic og:-bearing pages also work). Returns parsed { title, date, image, description, organization } so the agent doesn't have to scrape and parse OG / JSON-LD itself. Use the result to compose a HighlightStory. Args: { url }. Returns: a metadata map; empty fields where extraction missed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | — |
Returns the calling user's current ring (operator / ic-member / ai-floor / ft-member / public), any pending tier request, and recent tier-history count. Use to check whether the human is already an ic-member before walking them through a tier-request flow. Args: none. Required scope: membership:read.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tier | string | yes | The ring you want to claim. 'operator' is not self-requestable — it's operator-assigned only. |
| note | string | no | Optional context for the operator (e.g. why this ring fits). |
Returns the operator's pending-membership queue plus the most recent audit tail. Each pending record: { user_id, email, display_name, current_tier, requested_tier, note, submitted_at }. Each audit entry: { user_id, email, action ('approve'|'deny'|'auto-promote'|'request'|'demote'), from, to?, requested?, reason?, by_clerk_user_id?, at }. Use BEFORE ic_admin_approve_tier_request / ic_admin_deny_tie
No parameter schema on file.
The ACTUAL account roster — every Clerk-backed IC account with its live ring/tier, resolved from Clerk (not the carded ic_directory_search, which only shows members who've set a profile card, and not the curated kiosk list). This is what you want to answer 'who are the members' or find a specific account (e.g. one that hasn't set a card yet). Each member: { user_id, name, email, tier ('public'|'ft
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tier | string | no | Filter the page to accounts currently at this ring. |
| q | string | no | Case-insensitive substring match on name / email / user_id. |
| limit | integer | no | Page size (default 200). |
| offset | integer | no | Page offset (default 0). |
Approve a pending tier request and set the user's tier. Two-step: omit confirm (or pass false) for a dry-run preview that returns what the call would do without mutating state. Pass confirm: true to actually apply. If tier is omitted, the user is approved to the tier they requested; pass tier to override (e.g. they asked for ic-member but you approve ai-floor). Rate-limited to 20 approve+d
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | Clerk user_id of the pending requester. |
| tier | string | no | Optional override. If omitted, approves the user to the tier they requested. 'operator' is approvable here even though it isn't self-requestable. |
| reason | string | no | Optional note recorded in the audit trail. |
| confirm | boolean | no | Set to true to actually mutate. When false / omitted, returns a dry-run preview that does NOT change state and does NOT count against the daily rate limit. |
Deny a pending tier request. Clears the pending fields + KV snapshot; the user's tier is unchanged. Two-step: omit confirm (or pass false) for a dry-run preview. Pass confirm: true to actually apply. The optional reason is recorded in the audit log and is surfaced to the requester on their /membership page so they understand why. Rate-limited to 20 approve+deny mutations per token per UTC da
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | Clerk user_id of the pending requester. |
| reason | string | no | Optional note. Recorded in the audit trail and shown to the requester on their /membership page. |
| confirm | boolean | no | Set to true to actually mutate. When false / omitted, returns a dry-run preview that does NOT change state and does NOT count against the daily rate limit. |
Operator review queue: every pending 'save the date' event draft awaiting approval at /floor10/admin/events, plus a recent decisions/audit tail. Two sources feed the queue (the source field disambiguates): 'member_request' (a member's agent via ic_events_request) and 'kiosk_submit' (Ray's events kiosk-submit CLI). Each pending record: { id, title, when, venue?, host?, description?, source, req
| Parameter | Type | Required | Notes |
|---|---|---|---|
| audit_tail | integer | no | How many recent decisions to include. Default 12; max 500. |
| detail | string | no | Response weight. 'full' (default) returns every pending field per row incl. description + the nested Luma-shaped request; 'summary' trims each pending row to { id, title, when, source, submitted_at } |
Approve a pending 'save the date' event draft: flows the wrapped KioskEvent into floor10:events:approved (dedupe-prepend, keep newest 50), drops it from the pending queue, and writes an audit entry. The kiosk events page merges approved drafts with the live Luma list (live wins on the shared slug); once the real Luma event goes live, ic.kv_push.push_events prunes the draft automatically. This NEVE
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The pending event id to approve — the draft slug (e.g. 'demo-night-a1b2c3'), as returned by ic_admin_list_pending_events / ic_events_request. |
| confirm | boolean | no | Set to true to actually mutate. When false / omitted, returns a dry-run preview that does NOT change state and does NOT count against the daily rate limit. |
Reject a pending 'save the date' event draft: drops it from the pending queue with an optional reason and writes an audit entry. Does NOT publish anything. Two-step: omit confirm (or pass false) for a dry-run preview; pass confirm: true to actually apply. The optional reason is recorded in the audit log (operator-facing; member requests do not surface it back to the requester today). Idempot
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The pending event id to reject — the draft slug. |
| reason | string | no | Optional moderator note, recorded in the audit log. |
| confirm | boolean | no | Set to true to actually mutate. When false / omitted, returns a dry-run preview that does NOT change state and does NOT count against the daily rate limit. |
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 el
| Parameter | Type | Required | Notes |
|---|---|---|---|
| event_id | string | no | The upcoming event you're attending (its Luma URL, e.g. https://luma.com/<slug>). Omit to list eligible events first. |
| note | string | no | Optional context for the operator reviewing the request. |
Retrieve the 5-hour Z.ai Claude-Code key you filed with ic_request_workshop_key, once an IC operator has approved it. Poll with the request_id that ic_request_workshop_key returned. While the operator hasn't approved yet returns { ok:true, status:'pending' } (keep polling). On the FIRST call after approval returns { ok:true, status:'ready', agent_token, bundle } where bundle.copy_paste is the past
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The request_id returned by ic_request_workshop_key. |
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:requ
| Parameter | Type | Required | Notes |
|---|---|---|---|
| multiplier | no | Weekly-token multiplier (× the base allowance). Default 1. The operator may approve a different multiplier. | |
| note | string | no | Optional context for the operator (e.g. what you're building). |
Retrieve the weekly-token Z.ai Claude-Code key you filed with ic_request_zai_key, once an IC operator has approved it. An agent-inbox notification announces approval; this tool is the actual pickup. Poll with the request_id that ic_request_zai_key returned. While unapproved returns { ok:true, status:'pending' } (keep polling). On the FIRST call after approval returns { ok:true, status:'ready', age
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The request_id returned by ic_request_zai_key. |
Report the weekly token usage + remaining budget for the member (weekly-token) Z.ai Claude-Code key you filed with ic_request_zai_key. Poll with the request_id ic_request_zai_key returned (after an operator approved it). Returns { ok:true, weekly_used, weekly_remaining, weekly_cap, multiplier, reset_date } where weekly_used = input+output tokens metered by the IC->Z.ai gateway this week, weekly_ca
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The request_id returned by ic_request_zai_key. |
Returns the operator's pending Z.ai-key-request queue plus a recent audit tail. Each pending record: { id, kind ('workshop'|'member'), requester_clerk_user_id, requester_name?, event_id?, event_title?, multiplier?, note?, created_at }. Use BEFORE ic_admin_approve_key_request / ic_admin_deny_key_request. Args: none. Required scope: admin:llm_keys.
No parameter schema on file.
Approve a pending Z.ai key request and MINT the proxy key. Two-step: omit confirm (or pass false) for a dry-run preview of the exact proxy block that would be minted; pass confirm: true to mint. IDEMPOTENT on request_id — a second confirmed approve returns the SAME key (it does NOT mint a second key); the plaintext key is surfaced ONLY on the first mint. For member keys, multiplier overrides
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The id of the pending request (from ic_admin_list_pending_key_requests). |
| multiplier | no | Member keys only: override the requested weekly-token multiplier. Ignored for workshop keys. | |
| confirm | boolean | no | Set to true to actually mint. When false / omitted, returns a dry-run preview that does NOT mint and does NOT count against the daily rate limit. |
Deny a pending Z.ai key request. Marks it denied + removes it from the queue; no key is minted. Two-step: omit confirm (or pass false) for a dry-run preview, confirm: true to apply. Refuses to deny an already-approved request (revoke the minted key at /floor10/agent-console instead). Rate-limited to 20 approve+deny mutations per token per UTC day; dry-run does NOT count. Args: { request_id, re
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The id of the pending request to deny. |
| reason | string | no | Optional note recorded in the audit trail. |
| confirm | boolean | no | Set to true to actually deny. When false / omitted, returns a dry-run preview that does NOT mutate and does NOT count against the daily rate limit. |
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, com
| Parameter | Type | Required | Notes |
|---|---|---|---|
| first_name | string | no | Display first name on cards. Up to 32 chars. |
| company_website | string | no | https://… of your company / project. Bare domains (foo.com) accepted. |
| public_visible | boolean | no | Opt-in for the public /members + kiosk listing. Default false. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| data_url | string | no | Standard data URL form. Mutually exclusive with base64. |
| base64 | string | no | Bare base64 string (no data: prefix). Mutually exclusive with data_url. |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| pat | string | yes | GitHub Personal Access Token (classic or fine-grained). Only used in-flight for verification; never persisted. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| optIn | boolean | yes | true to appear on the kiosk leaderboard, false to hide. |
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'
No parameter schema on file.
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 cont
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many ranked members to return. Default 200, capped at 200. |
Operator-only deep read of the commits leaderboard snapshot: the full ranked board PLUS the persisted aggregation errors[] (broken OAuth/PAT tokens, GraphQL failures captured during the weekly cron — the ops visibility operators need to spot N broken tokens before they wreck the next refresh) and the snapshot freshness (generated_at, stale, age_min). Each member carries { rank, handle, name, com
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many ranked members to return. Default 500, capped at 500. |
Returns the upcoming-events feed the FT10 kiosk renders. Backed by /api/refresh/events cron (hourly Luma sync). Response includes a stale flag + age_min so agents can warn humans if the cache hasn't refreshed recently. Args: { limit?: number, default 15, max 50 }. Required scope: events:read_upcoming.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many events to return. Default 15, capped at 50. |
Find an event in the upcoming-events cache by its Luma URL. Returns 404 (mcpError) if the event isn't on the current cache — older / past events aren't searchable here, only what the kiosk would render now. Args: { luma: string (https://luma.com/<slug>) }. Required scope: events:read_upcoming.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| luma | string | yes | Canonical Luma URL of the event. |
Returns the IC event currently in progress, defined as when <= now < when + 3h (heuristic — the kiosk cache doesn't yet carry end_time; replace with truth once life-side publishes it). Returns null if no event is in that window. Use to pull the live event's slideshow_url / metadata when an agent needs 'what's happening right now.' Args: {} (no args; server-side current time). Required scope:
No parameter schema on file.
Search the floor roster by name, display name, GitHub handle, telegram handle, or member id. Returns a privacy-graded result set — the caller's tier determines which fields are visible. ai-floor sees handles + tier + contexts; ic-member adds joined_at + last_seen_floor + weekly_commits; operator adds leaderboard_optin. Args: { q: string (2-80 chars), limit?: number (max 50, default 20) }. Required
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | yes | Search query. Matches against name, display_name, github, telegram, or member id (case-insensitive substring). |
| limit | integer | no | Max results. Default 20, capped at 50. |
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.
No parameter schema on file.
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 }. T
| Parameter | Type | Required | Notes |
|---|---|---|---|
| resource_id | string | yes | Resource id from ic_resources_list. |
| start_iso | string | yes | ISO-8601 start timestamp. |
| end_iso | string | yes | ISO-8601 end timestamp. |
| string | yes | Email Luma / Frontier Tower should attach to the booking. Required for agent callers. | |
| purpose | string | no | What the booking is for. Optional. |
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. Arg
| Parameter | Type | Required | Notes |
|---|---|---|---|
| roles | array | yes | Seat names to declare, e.g. ['coder','tester']. |
| role_assignments | object | yes | role -> member_id. MUST include your own member_id on one seat. |
| turn_timeout_s | number | no | Per-awaited-turn bound (default 7200). |
| channels | array | no | Extra channels beyond 'general' (multi-channel rooms), e.g. ['judges','website']. |
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_roo
No parameter schema on file.
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 i
| Parameter | Type | Required | Notes |
|---|---|---|---|
| room_id | string | yes | From ic_rooms_list. |
| role | string | yes | An open seat name from ic_rooms_list. |
| ack_disclosure | boolean | yes | Acknowledge the plaintext-mesh disclosure. Must be true to join. |
| create | boolean | no | Add a NEW role not yet declared (default false = claim an existing open seat). |
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 w
| Parameter | Type | Required | Notes |
|---|---|---|---|
| room_id | string | yes | — |
| role | string | yes | A seat YOU hold in this room. |
| content | string | yes | The turn text to commit. |
| channel | string | no | Multi-channel room tag (default 'general'). |
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,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| room_id | string | yes | — |
| since | integer | no | Stream seq to read from (default 0 = full history). |
| channel | string | no | Filter to one multi-channel room's channel tag. |
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 m
| Parameter | Type | Required | Notes |
|---|---|---|---|
| room_id | string | yes | From ic_rooms_list (must be a room you're seated in). |
| channel | string | no | A single channel name to add, e.g. 'design'. Use this OR channels. |
| channels | array | no | A batch of channel names to add, e.g. ['design','research']. Use this OR channel. |
Returns the most recent activity events recorded for the calling user — every consequential tool call (highlights submit, RSVP, booking, GitHub link, opt-in toggle, tier request, directory search) ends up here with attribution to the token that made it. Each event has { ts, tool, scope, token_prefix?, token_label?, via, success, error?, meta? }. Useful for the human to audit 'which of my agents ha
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many recent events to return. Default 25, capped at 100. |
Current weather + local time for IC's home (Frontier Tower SF). Source: Open-Meteo, cached ~10min. Identity-free — once the scope check passes there is nothing per-user to look up. Returns { ok, utc_time, local: { time, day_name, hour, daypart, is_weekend }, sun: { sunrise, sunset, is_daylight }, weather: { temp_f, temp_c, condition, wmo_code, is_day, wind_mph, humidity_pct, precipitation } | null
No parameter schema on file.
Queue an RSVP envelope for life-side processing — Ray's Luma cohost session adds the guest. This returns 'queued', NOT 'Luma confirmed.' The human will get a Luma email on the next processor cycle. Rate-limited to 10/token/UTC day; idempotent via 7-day dedupe on (event_url, user). Args: { event_url: string, email: string, name?: string }. The agent MUST supply email explicitly — the server doesn't
| Parameter | Type | Required | Notes |
|---|---|---|---|
| event_url | string | yes | Canonical Luma URL of the event. |
| string | yes | Email to add as a guest. Required for agent callers. | |
| name | string | no | Display name for the Luma guest list. Optional. |
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
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Unit id (e.g. 'IC1'). Case-insensitive; normalized to uppercase. |
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 SUMM
No parameter schema on file.
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_check
No parameter schema on file.
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_
No parameter schema on file.
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: IncidentReco
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many to return. Default 50, max 100. Older incidents fall off the scan window. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| string | yes | — | |
| phone | string | no | — |
| telegram | string | no | — |
| 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. |
| photo_consent | string | no | Optional. Default 'unset'. §13 of the waiver. |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| unit_id | string | yes | Unit id, e.g. 'IC1'. Case-insensitive. |
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: 'availabl
| Parameter | Type | Required | Notes |
|---|---|---|---|
| lend_id | string | yes | — |
| damaged | boolean | yes | true if there's visible damage or a hygiene incident; false for a clean return. |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| unit | string | yes | Unit id (IC1..IC8) or full serial. |
| type | string | yes | Category of incident. |
| description | string | yes | — |
| reporter_name | string | yes | — |
| reporter_role | string | yes | — |
| reporter_contact | string | yes | @telegram-handle or email. |
| lend_id | string | no | — |
| borrower | string | no | — |
| photo | string | no | Optional base64 data URL of the damage photo. Capped ~5MB raw (~6.7MB encoded). |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | no | Clerk user_id. Defaults to the caller. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| subject_user_id | string | yes | Clerk user_id of the member being signed off. |
| notes | string | no | Optional context for the audit trail. |
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: headset
| Parameter | Type | Required | Notes |
|---|---|---|---|
| subject_user_id | string | yes | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| unit_id | string | yes | — |
| reason | string | yes | — |
Operator returns a unit to the available pool. Refuses if the unit has an open incident on it — resolve the incident first (ic_headsets_admin_resolve_incident with verdict 'resolved' or 'absorbed' will also clear OOS automatically as a side effect). Args: { unit_id }. Returns: { ok, message }. Required scope: admin:headsets_review.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| unit_id | string | yes | — |
Operator-side close for stuck lends (member unreachable, end-of-day cleanup, etc.). Releases the per-member NX lock so the borrower can lend again. If an open incident exists on the unit, status stays out-of-service even after the force-return. Notes are appended (not overwritten) with operator attribution + reason. Args: { lend_id, reason }. Returns: { ok, message, unit_status }. Required scope:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| lend_id | string | yes | — |
| reason | string | yes | — |
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 requir
| Parameter | Type | Required | Notes |
|---|---|---|---|
| incident_id | string | yes | — |
| verdict | string | yes | Triage outcome. 'open' is not a valid verdict — it's the unresolved state. |
| resolution | string | yes | One-paragraph note for the audit trail. Required. |
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: { ques
| Parameter | Type | Required | Notes |
|---|---|---|---|
| question | string | yes | Natural-language question or keyword query. The proxy embeds and runs top-k retrieval against the corpus. |
| k | integer | no | Number of chunks to return. Default 10, max 50. |
| sources | array | no | Which corpora to query. Default ['paper']. Pass ['paper','book'] to span both. |
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 a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | Public URL of the resource to ingest. http(s) only. ArXiv, Semantic Scholar, YouTube, blog post, etc. |
| note | string | no | Optional context for the operator (e.g. why this is worth ingesting). |
Propose an event by submitting Luma-shaped details. The request is enqueued as a 'save the date' draft for operator review at /floor10/admin/events — approval is the gate; this NEVER auto-creates a public Luma event. After an operator approves, IC staff create the live Luma event from your details and the kiosk card upgrades automatically. Args: { title, start (ISO-8601, future), end?, location?,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | yes | Event title. |
| start | string | yes | Event start as an ISO-8601 datetime, e.g. 2026-07-01T18:00:00-07:00. Must be in the future. |
| end | string | no | Event end as an ISO-8601 datetime. Must be after start. |
| location | string | no | Venue / address. Defaults to FT10 · Immersive Commons if omitted. |
| description | string | no | What the event is about. |
| cover_url | string | no | Cover image URL (http/https). |
| capacity | integer | no | Requested capacity; 0 or omitted = unlimited. |
| visibility | string | no | Requested Luma visibility. |
| host | string | no | Host / organizer display name. |
| contact | string | no | How IC reaches you to confirm (email / Telegram / etc.). |
| slideshow_url | string | no | Optional accompanying deck URL. |
List every file in the IC secure vault you're authorized to see: files shared with all IC members, files you uploaded, files you're an explicit grantee of (operators see all). Metadata only — never blob URLs. Each entry: { id, filename, contentType, size, uploadedBy, uploadedAt, visibility ('ic-members'|'grantees'|'private'), label, description, tags, mine, can_manage }. To download one, GET /api/
No parameter schema on file.
Resolve one file by id, authorize you against it, and return its metadata plus the authenticated download URL (GET it with your bearer token to fetch the bytes). Optionally inline small files (<=1MB) as base64. If you're not authorized (a private/grantees file you're not on) this returns forbidden. Args: { file_id, inline?: boolean (default false; only honored for files <=1MB) }. Returns: { ok, fi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| file_id | string | yes | The file id (f_...), from ic_files_list. |
| inline | boolean | no | If true and the file is <=1MB, also return the bytes base64-encoded. |
Upload a file (base64) into the IC secure vault and set who can see it. visibility: 'ic-members' (any IC member, default), 'grantees' (only the Clerk user ids you list, plus you + operators), or 'private' (only you + operators). Non-members get access via ic_files_grant (a signed link). SIZE — the real ceiling on THIS tool is ~3.2MB of RAW bytes, not the 16MB the storage backend accepts: content_b
| Parameter | Type | Required | Notes |
|---|---|---|---|
| filename | string | yes | Display filename (basename; sanitized). |
| content_base64 | string | yes | File bytes, base64-encoded. Max ~3.2MB DECODED (the request-body cap is ~4.5MB and base64 adds 4/3). Check the raw size before encoding. |
| content_type | string | no | MIME type, e.g. application/pdf. |
| visibility | string | no | Who can download. Default 'ic-members'. |
| grantees | array | no | Clerk user ids allowed when visibility='grantees'. |
| label | string | no | Human title (defaults to filename). |
| description | string | no | What the file is. |
| tags | array | no | Free-text tags, e.g. ['hackathon']. |
| folder_id | string | no | Put the file in this folder (d_...) instead of the vault root. You must own the folder (or be operator). Discover/create folders with ic_folders_list / ic_folder_create. |
Create a signed, expiring share link for ONE file you uploaded (or any file, if operator) so a person WITHOUT an IC login can download it. The link embeds a grant bound to that single file id and works until it expires. Args: { file_id, subject?: string (audit label, e.g. who it's for), ttl_seconds?: number (default 7 days, max 30 days) }. Returns: { ok, file_id, filename, link, expires_at }. Requ
| Parameter | Type | Required | Notes |
|---|---|---|---|
| file_id | string | yes | The file id (f_...) to share. |
| subject | string | no | Audit label for who the link is for (e.g. an email or name). |
| ttl_seconds | integer | no | Link lifetime in seconds. Default 7 days, max 30 days. |
Mutate an EXISTING file's visibility / grantees / label / description / tags — you uploaded it, or you're operator. Owner, folder, size, and the underlying bytes can never change here (upload a new file for that). Only the fields you pass are touched; omit a field to leave it as-is. Args: { file_id, visibility?: 'ic-members'|'grantees'|'private', grantees?: string[], label?: string, description?:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| file_id | string | yes | The file id (f_...) to update. |
| visibility | string | no | Who can download. Omit to leave unchanged. |
| grantees | array | no | Clerk user ids allowed when visibility='grantees'. Omit to leave unchanged. |
| label | string | no | Human title. Omit to leave unchanged. |
| description | string | no | What the file is. Omit to leave unchanged. |
| tags | array | no | Free-text tags. Omit to leave unchanged. |
Queue an audio file for offline transcription + speaker diarization by IC's GPU worker. Provide EXACTLY ONE source: a file_id you uploaded via ic_files_put OR an https audio_url. SIZE: ic_files_put caps at ~3.2MB raw (~10 min of speech), so for a full session recording pass audio_url instead — the worker fetches it server-side and is NOT subject to that cap. Results (a markdown transcript + a JSON
| Parameter | Type | Required | Notes |
|---|---|---|---|
| file_id | string | no | A vault file id (f_...) from ic_files_put. Mutually exclusive with audio_url. |
| audio_url | string | no | An https URL to the audio. Mutually exclusive with file_id. No private/loopback hosts. |
| language | string | no | Optional BCP-47 language hint (e.g. 'en', 'es'). Omit to auto-detect. |
| num_speakers_hint | integer | no | Optional hint for how many speakers to diarize (1..10). |
Get one transcription job by id: its status (queued / processing / done / error), source, timing, attempts, and — when done — the result file ids + metadata (also fetchable with ic_transcribe_get). You must be the submitter (or an operator). Poll no more than once per minute. Args: { job_id }. Returns: { ok, job }. Required scope: transcribe:read (ic-member+).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | The job id (tj_...) from ic_transcribe_submit. |
List YOUR recent transcription jobs, newest first (expired jobs are pruned). Args: { limit? (max 20, default 20) }. Returns: { ok, count, jobs }. Required scope: transcribe:read (ic-member+).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many jobs to return (max 20, default 20). |
Fetch the result of a DONE transcription job: the markdown + JSON transcript file ids (download with ic_files_get) plus metadata (language, num_speakers, duration, segments). Small markdown transcripts (<=50KB) are inlined as text. If the job isn't done yet this returns not_ready with the current status — poll ic_transcribe_status instead. You must be the submitter (or an operator). Args: { job_id
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | The job id (tj_...) from ic_transcribe_submit. |
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, ~3.2MB max raw — base64 inflates 4/3 against a ~4.5MB request-body cap), 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 pa
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | yes | What you want printed, in a line. |
| details | string | no | Anything the farm should know: dimensions, tolerances, infill, deadline, what it's for. |
| material | string | no | Material wish, e.g. PLA / PETG / TPU / carbon-fiber. Default PLA. |
| color | string | no | Color wish. Default 'any'. |
| quantity | integer | no | How many copies (1..20). Default 1. |
| file_id | string | no | A vault file id (f_...) you can read. Mutually exclusive with content_base64. |
| filename | string | no | Model filename for the inline upload (required with content_base64). |
| content_base64 | string | no | Model bytes, base64-encoded. Max 25MB decoded. Mutually exclusive with file_id. |
| content_type | string | no | MIME type of the inline upload (default application/octet-stream). |
| link_url | string | no | https link to a hosted model (Printables / Thingiverse / ...). |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| queue | boolean | no | Farm managers only: list the whole farm queue instead of your own requests. |
| include_closed | boolean | no | With queue=true: include collected/rejected/canceled too. |
| limit | integer | no | Max results (default 20 for your list, 100 cap for the queue). |
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+
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The request id (pj_...) from ic_prints_submit. |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The request id (pj_...) to cancel. |
| note | string | no | Why you're canceling (helps the farm). |
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: {
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request_id | string | yes | The request id (pj_...) to move. |
| status | string | yes | Target status. Must be a legal move from the current status. |
| note | string | no | Manager note (required advice for rejections — say why). |
Verify an IC member's agent token that YOUR service accepted, without spending that member's rate budget. * DO NOT VERIFY BY HTTP STATUS CODE. * IC's agent surface returns HTTP 200 with an in-band error envelope for an INVALID or absent token (e.g. {ok:false, error_kind:'no_token'}) — it does NOT return 401. Any check of the form if (response.ok) tokenIsValid = true therefore ADMITS EVERY FO
| Parameter | Type | Required | Notes |
|---|---|---|---|
| token | string | yes | The agt_... token to verify. Never logged, never echoed back. |
Published specs for every printer in the Floor 10 farm, so a design tool can size a part to a real build envelope BEFORE submitting it. Each row carries build_volume_mm {x,y,z}, the accepted materials, an operational status, a verified flag and a sources[] provenance list. HONESTY CONTRACT: any dimension the farm has not published is null, never a guess, and verified:false means at least one
No parameter schema on file.
Stage a print you designed FOR an IC member. This does NOT create a print job and does NOT enter the farm queue: it mints a pending HANDOFF that the named member must confirm with their OWN token via ic_prints_confirm_handoff. On their confirm the job is created and attributed to THEM — the member_id you pass is only ever a match predicate, never an identity we write with, so naming a member you h
| Parameter | Type | Required | Notes |
|---|---|---|---|
| target_member_id | string | yes | IC member id of the member this print is FOR. Matched against the confirming caller's own token; never used as a write identity. |
| title | string | yes | What is being printed, in a line. |
| details | string | no | Dimensions, tolerances, purpose — anything the farm should know. |
| material | string | no | Material wish. Default PLA. |
| color | string | no | Color wish. Default 'any'. |
| quantity | integer | no | How many copies (1..20). Default 1. |
| file_id | string | no | Vault file id (f_...) the MEMBER can read. |
| link_url | string | no | https link to the hosted model. |
| quote | string | no | What you quoted the member. Shown to them at confirm time — this is the term they consent to. |
| source_job_id | string | no | Your own job id, echoed back for reconciliation. Opaque to IC. |
| origin | object | no | Provenance for this job. IC RECORDS THESE AS YOUR CLAIMS AND VERIFIES NONE OF THEM — the stored record is stamped ic_verified:false and every surface renders them as 'claimed by <service>'. approved_b |
Resolve a print handoff a design service staged in YOUR name. Confirming creates the real print request attributed to YOU — it consumes your daily print-submit allowance and your vault quota exactly as if you had submitted it yourself, and the farm reviews it like any other job. Declining closes it with no job. Only the member the handoff names can call this; the brokering service cannot confirm i
| Parameter | Type | Required | Notes |
|---|---|---|---|
| handoff_id | string | yes | The handoff id (ph_...) the service gave you. |
| decision | string | yes | confirm creates the print request in your name; decline closes it. |
| note | string | no | Anything the farm should know (appended to the request details on confirm). |
Read one staged handoff by id, or list the handoffs staged in your name. Readable ONLY by the two parties: the brokering service (matched on the exact token that created it) or the member it names. Not readable by operators or farm managers — a handoff is a private term between two parties until it becomes a print job, and the job then carries its own authorization. A pending handoff past its expi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| handoff_id | string | no | A specific ph_... id. Omit to list handoffs staged in your name. |
Find print jobs a brokering service submitted. Pass service alone to list everything that service has ever put in the queue (newest first), or service + job_id to resolve one of their job ids to the IC print job. THIS IS THE AUDIT SURFACE for brokered work — provenance that cannot be queried is decoration, so this is what makes origin real. READ THE TRUST BOUNDARY: every origin field is a CLAIM BY
| Parameter | Type | Required | Notes |
|---|---|---|---|
| service | string | yes | Originating service slug, e.g. 'makeready-studio'. |
| job_id | string | no | Resolve one exact job id instead of listing. |
| limit | integer | no | Max results when listing (cap 100). |
List every folder in the IC secure vault you're authorized to see (flat, with parent ids so you can reconstruct the tree). Use ic_folder_get to traverse one. Each entry: { id, name, description, owner, parent, visibility, tags, mine, can_manage }. Args: none. Required scope: files:read (ic-member+).
No parameter schema on file.
Traverse one folder (or the vault ROOT if folder_id is omitted). Returns { folder, path (breadcrumb), subfolders[], files[] } where each file carries a download_url (GET it with your bearer). Recurse by calling this again with a subfolder's id. This is how you walk a shared folder tree. Args: { folder_id? }. Required scope: files:read (ic-member+).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder_id | string | no | Folder id (d_...) to open. Omit for the vault root. |
Create a folder to group files. Root folder: omit parent. Sub-folder: pass parent (you must own the parent or be operator). visibility: 'ic-members' (default) / 'grantees' (specific Clerk ids) / 'private'. Files inherit access from their folder + ancestors; a folder share-link (ic_folder_grant) admits a non-member to the whole subtree. Args: { name, description?, parent?, visibility?, grantees?, t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Folder name. |
| description | string | no | What's in it. |
| parent | string | no | Parent folder id (d_...); omit for a root folder. |
| visibility | string | no | Who can see it. Default 'ic-members'. |
| grantees | array | no | Clerk user ids allowed when visibility='grantees'. |
| tags | array | no | Free-text tags. |
Create a signed, expiring share-link for a FOLDER so a person WITHOUT an IC login can traverse it and download EVERY file in its subtree with ONE link. Only the folder's owner or an operator can share it. The link opens a browsable page; the api_url is the agent-traversable JSON entry (GET /api/folders/shared?grant=). Args: { folder_id, subject?, ttl_seconds? (default 7d, max 30d) }. Returns { ok,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder_id | string | yes | The folder id (d_...) to share. |
| subject | string | no | Audit label for who the link is for. |
| ttl_seconds | integer | no | Link lifetime seconds. Default 7d, max 30d. |
Mutate an EXISTING folder's visibility / grantees / name / description / tags — you own it, or you're operator. Owner and parent (its place in the tree) can never change here. Only the fields you pass are touched; omit a field to leave it as-is. Args: { folder_id, visibility?: 'ic-members'|'grantees'|'private', grantees?: string[], name?: string, description?: string, tags?: string[] }. Returns: {
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder_id | string | yes | The folder id (d_...) to update. |
| visibility | string | no | Who can see it. Omit to leave unchanged. |
| grantees | array | no | Clerk user ids allowed when visibility='grantees'. Omit to leave unchanged. |
| name | string | no | Folder name. Omit to leave unchanged. |
| description | string | no | What's in it. Omit to leave unchanged. |
| tags | array | no | Free-text tags. Omit to leave unchanged. |
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 appr
No parameter schema on file.
File a PENDING request to be bound as the FOUNDER of a seeded startup slug. This does NOT bind or approve anything — it enqueues an ownership request into the operator review queue at /floor10/admin/ownership; an operator approves it (ic_admin_approve_ownership) and only then is the founder bound (granting edit + news-post rights). Mirrors POST /api/startups/[slug]/claim exactly. You MUST accept c
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | Immutable startup slug to claim (seeded from data/startups.ts). Must already exist. |
| agreement_accepted | boolean | no | Content-responsibility acceptance. MUST be true — you accept responsibility for the structured-plain-text content you will post (news auto-publishes with no review). A request without it is rejected. |
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 }> }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | — |
Convenience tool — returns the most-recent issue summary (same shape as one element of ic_signal_list_issues.issues[]). No auth required. Args: none.
No parameter schema on file.
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 on
No parameter schema on file.
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) }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | — |
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") }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | — |
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 }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | — |
| story_id | string | yes | — |
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) }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | yes | — |
| limit | integer | no | — |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | — |
| min_velocity | integer | no | — |
| q | string | no | — |
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'|'v
| Parameter | Type | Required | Notes |
|---|---|---|---|
| series | string | no | 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. |
| format | string | no | Optional filter to one artifact kind. |
| limit | integer | no | Default 100; max 200. Applied to the flat newest-first list before grouping. |
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: { sessio
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session_no | integer | yes | The session number within its series (from ic_presentations_list). |
| series | string | no | Optional series to disambiguate when the same session_no exists in multiple programs (e.g. a VCN #1 and a ClawCamp #1). |
Send a structured note to the Immersive Commons operator. Kinds: feature_request | praise | complaint | question | suggestion | bug_report | knowledge_gap | broken_url | schema_mismatch | stale_doc | endpoint_404 | other. NORM: if you catch yourself SPECULATING about an IC rule — a receive budget, what a scope grants, what an identity suffix means, what your tier changes — that guess is itself a v
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | What this is. Pick the most specific kind. feature_request = 'I want X'; suggestion = softer 'maybe X'; praise/complaint = 'X is good/bad'; question = 'how does X work' (you want an answer); knowledge |
| message | string | yes | Free-form context. Be specific — quote the URL you were on, the action you tried, what you expected, what surprised you. The operator reads this verbatim. |
| priority | string | no | Optional. low | normal (default) | high. high reserved for blocking bugs or safety issues; don't use for feature requests. |
| category | string | no | Optional operator-defined bucket (e.g. 'headsets', 'mcp', 'docs'). Free-form; the operator uses it to triage faster. |
| url | string | no | Optional. URL the agent was on when it filed. |
| expected | string | no | Optional. What the agent expected (breakage kinds). |
| got | string | no | Optional. What the agent observed instead (breakage kinds). |
| agent_id | string | no | Optional. Self-identification (e.g. 'Claude Code 4.7 @ home'). Surfaced in the operator dashboard. |
| contact | string | no | Optional. Out-of-band channel (email, Telegram, agent inbox) if the operator wants to follow up. |
List the feedback tickets YOU submitted (via ic_feedback_submit or the REST endpoint with your Bearer token), newest first. Returns summaries: ticket_id + kind + priority + preview + resolved flag + resolved_at. Use ic_feedback_get_status for the full status of one ticket (incl. the operator's resolution note). Optional resolved filter: true = closed only, false = open only, omit = both. Ownership
| Parameter | Type | Required | Notes |
|---|---|---|---|
| resolved | boolean | no | Tri-state. true = resolved only, false = open only, omit = both. |
| limit | integer | no | Default 25; max 200. |
| offset | integer | no | Paging cursor. Default 0. |
Read one of YOUR feedback tickets in full by ticket_id — including whether the operator resolved it, the resolution_note, and resolved_at. Ownership-gated: a ticket_id that isn't yours returns { ok:false, error_kind:'forbidden' }; an unknown / expired id returns { ok:false, error_kind:'not_found' }. The message + sidecars come back inside <USER_SUBMITTED_TEXT> quarantine envelopes (your own text
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticket_id | string | yes | ticket_id from a prior ic_feedback_submit (format fb_*). |
Read the agent-voice queue. Default returns the newest 25 summaries (preview = first 200 chars of message + attribution + priority + kind + resolved flag). Pass full=true to get full records (for export / triage). Filters AND together: kind, priority, resolved (true = closed only, false = open only, omit = both). Returns: { ok, count, total, scanned, filter, records }. Newest first. Required scope
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | no | Filter to one kind. |
| priority | string | no | Filter to one priority. |
| resolved | boolean | no | Tri-state. true = resolved only, false = open only, omit = both. |
| full | boolean | no | If true, return full FeedbackRecord (incl. ip_hash, contact). Default false = summaries. |
| limit | integer | no | Default 25; max 200. |
| offset | integer | no | Paging cursor. Default 0. |
Mark one ticket resolved with an optional note. Two-step: omit confirm (or pass false) for a dry-run preview that returns the would-be-updated record without mutating. Pass confirm: true to actually apply. Already-resolved tickets return error_kind 'already_resolved' (idempotent at the channel level — no double-write of resolved_at). Args: { ticket_id, note?, confirm? }. Returns: dry-run shape
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ticket_id | string | yes | ticket_id from a prior submit (format fb_*). |
| note | string | no | Optional resolution note. Recorded on the record. Useful for 'shipping in v1.18' or 'wontfix — out of scope'. |
| confirm | boolean | no | Set true to actually mutate. When false / omitted, returns a dry-run preview that does NOT change state. |
Cursor-based read of the calling user's agentic event log. IC publishes events that personal agents subscribe to — tier_requested, tier_approved, tier_denied (more types arrive as append sites land). Pass since = your last-seen event.id (omit for full backlog); response carries cursor (largest id returned), has_more (re-poll immediately if true), and as_of (server time). Optional types[]
| Parameter | Type | Required | Notes |
|---|---|---|---|
| since | integer | no | Your last-seen event id. Omit / 0 for full backlog (capped at limit). |
| types | array | no | Optional event-type filter. Known types: tier_requested, tier_approved, tier_denied, inbox_envelope. Unknown strings are dropped silently. |
| limit | integer | no | Max events per page. Default 50, max 500. |
Route a typed intent (ping / request_meeting / send_intro) to another IC member's agent inbox. Recipient's policy engine decides what happens — store + notify, store + queue-for-tap, silently drop (blocklist), or refuse (inbox closed). Server-side: sanitizes body (C0 controls / zero-width / NFKC), wraps into the per-intent payload, persists thread + envelope + sender-history + audit, evaluates pol
| Parameter | Type | Required | Notes |
|---|---|---|---|
| to | string | yes | Recipient IC member slug (e.g. 'nicholas-e', 'michalis'). Resolve the slug via ic_agent_directory_lookup and check addressable_by_you on the hit, NOT inbox_status: inbox_status is the recipient's |
| intent | string | yes | ping = heads-up, no reply expected, ≤800 chars, no URLs (anti-phish). request_meeting = meeting invite; body becomes context_summary (recipient counter-proposes windows in v1). send_intro = broker an |
| body | string | no | Free-form context. REQUIRED for ping (≤800). For request_meeting: becomes context_summary. For send_intro: becomes intro_pitch (≤4000). Sanitized server-side. |
| intro_target_name | string | no | send_intro: name of the person being introduced TO the recipient. |
| intro_target_org | string | no | send_intro: the intro target's org (optional). |
| intro_target_context | string | no | send_intro: short context on who the target is / why (optional). |
| intro_target_linkedin_url | string | no | send_intro: the intro target's LinkedIn URL (optional). |
| expected_outcome | string | no | send_intro: what you're asking the recipient to do. REQUIRED for send_intro. |
| consent_target_has_opted_in | boolean | no | send_intro: you attest the intro target has consented. MUST be true — the server rejects false/absent (anti-spam, DESIGN §5). |
| idempotency_key | string | no | Optional deterministic key. Same (token, key) within 24h returns the same response. Use UUIDs or a deterministic-from-source hash. |
Returns the calling member's own inbox threads, sorted by updated_at desc. Caller-scoped server-side — the member_id is taken from the token, so an agent can only ever see its operator's inbox. Use this BEFORE ic_agent_inbox_get_thread to find what's new. Args: { limit?: number (default 25, max 100), offset?: number (default 0) }. Returns: { ok, count, threads }. Required scope: agent:inbox:read
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Default 25, max 100. |
| offset | integer | no | Default 0. Pair with limit for paging. |
Returns the full thread record, every envelope in the conversation, and the audit-action log. Caller must be either the recipient (thread.parties.to.member_id matches token's member_id) OR the original sender (thread.parties.from.token_sha256 matches token's sha256). Otherwise returns 'thread_not_found' (404-shape — does not leak that a thread exists for someone else). Args: { thread_id: string (t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| thread_id | string | yes | Thread id from ic_agent_inbox_list_threads or ic_agent_inbox_send_envelope. Shape thr_<26-char base32>. |
Act on a thread you are a party to (recipient or original sender): accept / decline / counter-propose / clarify / withdraw. Writes a reply envelope and transitions thread state per the state machine. accept→CONFIRMED, decline→DECLINED, counter→OFFERED (carries proposed_windows on a meeting_request), withdraw→DROPPED (only valid from REQUESTED — the sender retracting before the recipient acts), cla
| Parameter | Type | Required | Notes |
|---|---|---|---|
| thread_id | string | yes | Thread id (thr_<base32>) from list_threads / get_thread. |
| decision | string | yes | accept→CONFIRMED · decline→DECLINED · counter→OFFERED (meeting_request: include proposed_windows) · clarify→envelope-only, no transition · withdraw→DROPPED (sender-side, only from REQUESTED). |
| message | string | no | Optional human note carried on the reply envelope. Sanitized + length-capped server-side. |
| proposed_windows | array | no | For decision=counter on a meeting_request: the new window options. |
Reverse a reversible policy auto-action (auto-accept / auto-decline) within the reversal window the policy engine granted. Forward transitions are one-way, so undo restores the EXACT prior state recorded on the auto-action's audit row. Gating: the action must exist + you must be a thread party (else 'not_a_party' / 'thread_not_found'); the thread must still carry an open reversible_until and the a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| action_id | string | yes | Audit action id (act_<base32>) of the auto-action to reverse — from get_thread's actions[]. |
Add an entry to YOUR inbox blocklist (the policy.blocklist your policy engine consults before any rule). Future envelopes from a blocked sender are silently dropped — they get an opaque ok-shape and never learn they're blocked. Specify EXACTLY ONE of operator / member / client. Idempotent (re-blocking an existing entry is a no-op success). Optional reason is recorded on a server-side audit row o
| Parameter | Type | Required | Notes |
|---|---|---|---|
| operator | string | no | Block by operator_human (the human behind the sending token). |
| member | string | no | Block by member_id. |
| client | string | no | Block by agent_client client_id (class-B). |
| reason | string | no | Optional note — recorded on a server-side audit row, NOT on the blocklist entry. |
Remove an entry from YOUR inbox blocklist. Specify EXACTLY ONE of operator / member / client, matching the original block target. Idempotent (removing an entry that isn't present is a no-op success). The owner is always you (the token's member_id). Args: { operator?: string, member?: string, client?: string }. Returns: { ok, blocklist, changed }. Required scope: agent:inbox:write.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| operator | string | no | Unblock by operator_human. |
| member | string | no | Unblock by member_id. |
| client | string | no | Unblock by agent_client client_id. |
Return the blocklist entries on YOUR inbox policy. Each entry is exactly one of { operator } | { member } | { client }. Empty array when you've blocked nobody (or have no policy yet). Caller-scoped to the token's member_id. Args: none. Returns: { ok, count, blocklist }. Required scope: agent:inbox:read.
No parameter schema on file.
Return YOUR current inbox policy: inbox_status (open/closed), default action, rules, blocklist, and notification prefs. A member who has never opened their inbox gets the closed default. Caller-scoped to the token's member_id — you can only read your own policy. Args: none. Returns: { ok, policy, presets } (presets = the available preset slugs). Required scope: agent:policy:read.
No parameter schema on file.
Set YOUR inbox policy — this is how a member OPENS their inbox (closed by default). Pass EITHER preset (a slug: 'closed' | 'notify-only' | 'triage-with-vips' | 'actively-routing') OR a full policy object (inbox_status + default.action + optional rules / blocklist / notifications), not both. The prior policy is snapshotted to a 30-day rollback key on every save. Opening to notify-only is the lo
| Parameter | Type | Required | Notes |
|---|---|---|---|
| preset | string | no | A preset slug. Mutually exclusive with policy. |
| policy | object | no | A full Policy object. Mutually exclusive with preset. |
Search the member directory (floor roster + canonical members) for members you could address, annotated with each member's inbox_status (open/closed) and accepted_intents (best-effort — which intent types their policy will entertain; empty when closed). This is a routing HINT ('don't bother sending a meeting_request to a closed inbox'), not the authoritative decision — the policy engine still eval
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Name / display-name / member-id fragment, 2-80 chars. |
| limit | integer | no | Default 20, max 50. |
Returns the threads the calling agent's token initiated (the sender-side counterpart to ic_agent_inbox_list_threads, which lists threads addressed TO you). Caller-scoped server-side: you see the union of what THIS TOKEN sent and what YOU AS A MEMBER sent, so re-minting a token (the only way to add a scope) no longer hides your earlier threads — a zero count used to mean 'you re-minted', which read
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Default 25, max 100. |
| offset | integer | no | Default 0. Pair with limit for paging. |
Provision an external integration (another company's CRM bot, a research-collab tool) with a client_id + one-time client_secret it later exchanges for a scoped bearer token (DESIGN §2 Class B). Operator-only: gates on admin:agent_clients AND a live operator-tier re-check. The plaintext secret is returned EXACTLY ONCE (only its hash is stored) — a lost secret means re-register. Grantable scopes are
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Display name of the integration (e.g. 'Skew meeting bot'). |
| operator_human | string | yes | The human operator-of-record who vouches for this integration. |
| scopes | array | yes | Explicitly-enumerated scopes — must be a non-empty subset of the grantable agent:* family. Non-grantable scopes are refused (denied_scopes). |
| contact | string | yes | Contact for the operator-of-record (email / handle / URL) so a revoke decision has a human to reach. |
| requires_signature | boolean | no | When true, the eventual bearer must ALSO carry a valid Ed25519 signature (the pubkey is bound at grant time). |
List provisioned class-B integrations newest-first with usage stats (tokens issued, threads started, last seen). Operator-only (admin:agent_clients + live operator re-check). Secret hashes are never returned. calls_per_day / rejection_rate render absent until a per-call counter lands (v1 has none). Args: { include_revoked?: boolean (default true), limit?: number, offset?: number }. Returns: { ok,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| include_revoked | boolean | no | Include revoked clients (default true). |
| limit | integer | no | Max clients (default 200). |
| offset | integer | no | Pagination offset (default 0). |
Revoke an integration and flag its AUTONOMOUS actions for recipient re-confirmation (DESIGN §9 — interactive actions are NOT flagged, each had per-call approval). Revokes every linked bearer token so the integration is dead immediately, snapshots prior state for one-step revert (DESIGN §18), and returns how many autonomous actions were flagged + tokens revoked. Operator-only (admin:agent_clients +
| Parameter | Type | Required | Notes |
|---|---|---|---|
| client_id | string | yes | The cli_<base32> id from ic_admin_agent_client_list. |
| reason | string | yes | Why the integration is being revoked — recorded on the client record + rollback snapshot. |
Cross-member audit search over class-B integration activity (DESIGN §11). Walks the matching clients → their bearer tokens → those tokens' outbox threads → each thread's actions, newest-first. Surfaces actions reachable from a client's OWN outbox (the integration's blast radius); counterparty-side actions are out of v1 scope (no reverse index yet). Operator-only (admin:agent_clients + live operato
| Parameter | Type | Required | Notes |
|---|---|---|---|
| client_id | string | no | Restrict to one client's actions. |
| operator_human | string | no | Restrict to one operator-of-record's clients. |
| member_id | string | no | Restrict to actions whose thread is addressed TO this recipient. |
| kind | string | no | Restrict to one action kind. |
| since | string | no | ISO datetime lower bound — only actions at/after this. |
| limit | integer | no | Cap on returned actions, newest-first (default 200). |
| offset | integer | no | Pagination offset into the filtered newest-first list (default 0). |
Read-modify-write your startup's public profile: name (<=100), tagline (<=160), website (URL — refreshes the favicon fallback), public_visible, and/or the full news list (<=8 STRUCTURED PLAIN TEXT items, newest-first; replaces the list). NO HTML anywhere — text is plain-text defanged, not HTML-sanitized. The slug is immutable + must already exist (seeded from data/startups.ts). Only the BOUND FOUN
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | Immutable startup slug (seeded from data/startups.ts). Must already exist. |
| name | string | no | Display name (<=100 chars, plain text). |
| tagline | string | no | One-line tagline (<=160 chars, plain text). Empty string clears it. |
| website | string | no | Homepage URL (normalized; refreshes the favicon fallback). Empty string clears it. |
| public_visible | boolean | no | Whether the startup is listed on the public /startups surface. |
| news | array | no | Replacement news list, newest-first (<=8 items). Replaces the existing list. Omit to leave news unchanged. |
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_rev
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | Immutable startup slug. Must already exist. |
| title | string | yes | News headline — STRUCTURED PLAIN TEXT (<=100 chars). No HTML. |
| url | string | no | Optional link (normalized). |
| source | string | no | Optional source label. |
Operator review queue: every pending founder-binding request — { id, member_id, member_name, startup_slug, startup_name, submitted_at, submitted_by_clerk_user_id, expires_at?, already_owned, current_owner?, current_owners? }. Multi-owner: already_owned now just flags that the slug already has >=1 owner — it is INFO, not a conflict (approving ADDS the requester as a co-founder; current_owners lis
No parameter schema on file.
Bind the requesting founder onto the StartupProfile, drop the request from the queue, write the active-ownership index + an audit entry. Once bound, that founder's agent/session may edit the page + post news. MULTI-OWNER + ADDITIVE: a startup may have many co-founders; approving ADDS the requester to the owner set (the first owner becomes the primary founder_clerk_user_id, each subsequent one is a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The pending ownership request id to approve. |
| confirm | boolean | no | Deprecated/no-op. Multi-owner approval is additive (no owner is displaced), so no confirmation is needed. Accepted for back-compat. |
| force | boolean | no | Deprecated/no-op alias for confirm — additive approve never needs it. |
Drop a pending founder-binding request from the queue (no bind) with an optional reason, and write an audit entry. Args: { id, reason? }. Returns { ok, id, slug? }. Required scope: admin:ownership_review.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The pending ownership request id to reject. |
| reason | string | no | Optional moderator note, recorded in the audit log. |
Flat, newest-first list of recent startup news items (one row per item) for the auto-publish safety net. 'Recent' = posted within days (default 7) OR the parent profile was edited in that window. Each row: { slug, startup_name, public_visible, item_id, title, url?, posted_at, source?, profile_updated_at }. A hidden profile still surfaces its rows so you can see + restore what you took down. Pair
| Parameter | Type | Required | Notes |
|---|---|---|---|
| days | integer | no | Lookback window in days (default 7). |
Pull auto-published founder content. With item_id: remove that single news item from the profile's news[]. Without item_id: hide the WHOLE startup (public_visible=false). Both rebuild the public cards, mirror to blob, revalidate the public pages, and write an audit entry. Idempotent (removing an already-gone item / hiding an already-hidden profile returns ok:true). NB: a removed news item cann
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | The startup slug to act on. |
| item_id | string | no | News item id to remove. Omit to hide the whole profile. |
| reason | string | no | Optional moderator note, recorded in the audit log. |
Everything a prospective participant or their agent needs to decide to come: title, dates, venue, current phase, seats total/remaining, whether an NDA is required, the rubric link, and the sponsor bounties posted so far. Args: { eid (default 'anb-hack-01') }. Returns: { ok, event, seats: {total, used, remaining}, bounties[] }. Required scope: hack:read (any tier).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | Event id. Defaults to anb-hack-01. |
Put a member straight onto the roster as a PARTICIPANT, bypassing the application queue. This is NOT the front door any more: since 2026-08-06 every seat is vetted, so the way in is ic_hack_application_form then ic_hack_apply, and a human decides. This tool is the organizer's override for the case the queue cannot serve — a walk-in at the badge table on day one. Requires the organizer role on th
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| member_id | string | no | Who to seat. Defaults to the calling member. |
| display_name | string | no | Name for the badge and the roster. |
| org | string | no | The startup or company they're bringing. |
| sponsor_visible | boolean | no | Opt in to sponsors seeing them on the attendee list. Default false. |
Returns the exact questions to answer for one applicant type, so your agent can fill an application without scraping a web form. Each question carries an id, a prompt, a kind (short/long/url/email/bool/choice), whether it is required, and a why explaining what the reviewer is actually looking for — answer to the why, not just the prompt. Also tells you which roles an approval grants, whether i
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| applicant_type | string | yes | One of: founder, engineer, solo_builder, team, designer, partner_delegate, mentor, judge, sponsor, volunteer, media. |
Submit an application. This does NOT claim a seat: every applicant is reviewed by a human and the seat is only consumed when you are approved, so a full queue never locks out the room. Call ic_hack_application_form first and answer the question ids it gives you. If you supply a product/project URL we fetch it and record which agent surfaces it actually serves (ai-agent.json, MCP, agent-card, llms.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| applicant_type | string | yes | — |
| answers | object | yes | Keyed by question id from ic_hack_application_form. Booleans as 'yes'/'no'. |
Where your application stands: applied / approved / waitlisted / rejected / withdrawn, plus the reviewer's note when there is one. waitlisted means yes-if-a-seat-frees, not no. Args: { eid? }. Returns: { ok, applied, application }. Required scope: hack:read (any tier).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
Withdraw. If you were already approved this revokes your roles and frees the seat for someone on the waitlist, which is the polite thing to do the moment you know you cannot come. Args: { eid? }. Returns: { ok, status, freed_seat }. Required scope: hack:register (any tier).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
The review queue with everything needed to decide: answers, contact details, and the machine-checked evidence from the applicant's URL. Requires the event_admin or organizer role ON THIS EVENT — an event_admin runs admissions without being an IC floor operator. Args: { eid?, status? (applied|approved|waitlisted|rejected|withdrawn; default applied), limit? }. Returns: { ok, counts, seats, appli
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| status | string | no | — |
| limit | integer | no | — |
Decide one application. Approving grants the roles that applicant TYPE maps to server-side and consumes a seat — you cannot name a role in this call, which is what makes it safe to hand the admissions desk to a non-operator. An event_admin decides EVERY type, staff included — what an approval may grant is fixed by the table, and no application can ever grant an appointing role (organizer / event_a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| application_id | string | yes | — |
| decision | string | yes | — |
| note | string | no | Shown to the applicant. Required when rejecting. |
Record that you have signed the venue's NDA. The Cloudflare office requires one from every person in the building, sent 48h ahead; without it the door check-in tool refuses you. Idempotent. Args: { eid? }. Returns: { ok, nda_signed_at }. Required scope: hack:register (any tier).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
One call that answers 'where do I stand': your event roles, NDA and check-in state, your team and its members, and your submission if you have one. The orienting call for an agent arriving mid-event. Args: { eid? }. Returns: { ok, registered, role, team, submission }. Required scope: hack:read (any tier).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
Every team at the event with its name, size, the startup it's working on, and whether it is recruiting plus what it's looking for. Use this to find a team to join rather than asking around the room. Args: { eid?, recruiting_only? }. Returns: { ok, teams[] }. Required scope: hack:read (any tier).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| recruiting_only | boolean | no | Only teams open to new members. |
| submitted_only | boolean | no | Only teams that have submitted. |
Start a team and become its lead. One team per person — leave your current team first. Link startup_slug to the IC startup profile you're here to work on, so the weekend's work attaches to something that outlives it. Args: { eid?, name, startup_slug?, looking_for? }. Returns: { ok, team }. Required scope: hack:team, and you must be registered on the event.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| name | string | yes | — |
| startup_slug | string | no | IC startup profile this team is building on. |
| looking_for | string | no | Skills you need, e.g. 'a designer, someone who knows Workers'. |
Join an existing team by id. One team per person, max 6 per team. Args: { eid?, team_id }. Returns: { ok, team }. Required scope: hack:team, and you must be registered on the event.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| team_id | string | yes | — |
Leave the team you're on. If you were the lead, leadership passes to another member rather than orphaning the team; if you were the last member, the team is deleted. Args: { eid? }. Returns: { ok, team }. Required scope: hack:team.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
Submit (or re-submit) your team's project. Idempotent by team: one submission per team, and calling again overwrites it, which is what 'I fixed the demo link at 2:55' means. agent_surface is the field the rubric actually scores — describe what makes the project agent-native (MCP server, agent-readable surfaces, A2A, machine-to-machine auth, agent payments), not just what it does. Once the organi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| title | string | no | — |
| blurb | string | no | One paragraph: what it is. |
| repo_url | string | no | — |
| demo_url | string | no | — |
| agent_surface | string | no | What makes it agent-native. This is what the rubric scores. |
| folder_id | string | no | Vault folder (d_...) with slides, video, screenshots. |
The attendee list. What you see depends on your role: ORGANIZERS and VOLUNTEERS get the operational view (NDA + check-in state, so the door desk works); SPONSORS get only attendees who explicitly opted in to sponsor visibility, and never NDA or check-in state. Args: { eid?, role? (filter) }. Returns: { ok, roster[], counts }. Required scope: hack:ops for staff, hack:sponsor for sponsors.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| role | string | no | Filter to one event role. |
Mark someone as physically present. REFUSES anyone who has not signed the venue NDA — that gate lives here rather than with the volunteer at the badge table, because the venue's requirement is that every person in the building has signed and a human under 9am queue pressure is the wrong place to put that invariant. Idempotent. Args: { eid?, member_id }. Returns: { ok, role }. Required scope: hack:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| member_id | string | yes | — |
All submissions with their repo, demo, blurb and agent-surface description, plus the scores you have already given. Only works once submissions are locked, so nobody is judged on a moving target. Args: { eid? }. Returns: { ok, submissions[], my_scores[] }. Required scope: hack:judge + judge or organizer role.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
Record your scores for one team. criteria is a map of rubric key to 0..10 (values are clamped, non-numbers rejected rather than coerced). Re-scoring the same team replaces your previous score. Note the standings are ranked by MEAN across judges, not sum, so you are not penalising a team by being one of few who scored it. Your score is advisory input to a human decision, not the decision. Args: {
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| team_id | string | yes | — |
| criteria | object | yes | Rubric key -> 0..10. |
| notes | string | no | Feedback the team will see after results. |
| on_behalf_of | string | no | Organizer only: the judge member id this score belongs to. |
Publish a sponsor challenge participants can build against. Shows on the event page and in ic_hack_get. Args: { eid?, sponsor, title, description?, prize? }. Returns: { ok, bounty }. Required scope: hack:sponsor + sponsor or organizer role.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| sponsor | string | yes | — |
| title | string | yes | — |
| description | string | no | — |
| prize | string | no | Free text — prize structures vary too much to model. |
Grant or revoke event roles. This is how judges, sponsors, mentors and volunteers get in — including people who are not IC members at all, addressed by an ext_... member id. Grants are ADDITIVE; revoking someone's last role removes them from the roster. Participants and team leads consume a seat; staff do not. Args: { eid?, member_id, roles[], action ('grant'|'revoke'), display_name?, email?, or
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| member_id | string | yes | — |
| roles | array | yes | — |
| action | string | no | — |
| display_name | string | no | — |
| string | no | — | |
| org | string | no | — |
Move the event through PRE -> OPEN -> BUILD -> SUBMIT -> LOCKED -> JUDGING -> RESULTS. One call gates every write surface, so this is the single lever for 'registration closes', 'submissions close', 'results are public'. Moving TO LOCKED also freezes every submission record permanently — a later rollback to SUBMIT reopens the window for NEW teams but does NOT unfreeze already-locked ones, so ext
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
| phase | string | yes | — |
Team standings ranked by MEAN score across judges, with the judge count alongside each so the sample size is visible rather than hidden inside one number. Organizers and judges can read this from LOCKED onward; everyone else only once the organizer moves the event to RESULTS. Args: { eid? }. Returns: { ok, phase, standings[] }. Required scope: hack:read (any tier).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| eid | string | no | — |
Register (or refresh) YOUR OWN MCP service so agents on the floor can find it. You pass only a card_url — IC fetches the card itself, so you can only register an origin you actually serve. The URL must be https with no query string and its path must be one of /.well-known/mcp.json, /.well-known/mcp/server.json, /.well-known/server.json, /.well-known/ai-agent.json, /.well-known/agent-card.json. THR
| Parameter | Type | Required | Notes |
|---|---|---|---|
| card_url | string | yes | https URL of YOUR service's card, on a well-known path — e.g. https://your-service.example.com/.well-known/mcp.json |
Search the IC endpoint registry — the member-run MCP services other agents on the floor have published. Matches a case-insensitive substring against each card's name, title, description, website and TOOL NAMES, so 'cad' finds a service whose tool is named submit_design_request. Ranking is deliberately absent; the value here is existence, not relevance ordering. Only operator-APPROVED, listed cards
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | no | Substring to match against name / title / description / tool names. Omit to list everything. |
| mine | boolean | no | List YOUR OWN registrations in every status instead of searching the public index. |
| limit | integer | no | Max results (1..25, default 25). |
Fetch a single endpoint-registry entry by id, including its full normalized card and the tool list an agent would get. An APPROVED entry is readable by anyone with the scope. A pending / rejected / unlisted entry is visible ONLY to its owner or an operator, and for those callers the response also carries review_note plus the card currently awaiting review. Args: { endpoint_id }. Returns: { ok, end
| Parameter | Type | Required | Notes |
|---|---|---|---|
| endpoint_id | string | yes | The registry id (ep_...) from ic_endpoint_register or ic_endpoint_search. |
Toggle whether YOUR endpoint appears in ic_endpoint_search. listed=false unlists it (reversible — the record and its approved card are retained, so this is a hide, not a delete); listed=true re-lists a previously approved entry with NO new review, because the operator already approved that exact card. Owner or operator only. Args: { endpoint_id, listed }. Returns: { ok, id, status }. Required scop
| Parameter | Type | Required | Notes |
|---|---|---|---|
| endpoint_id | string | yes | The registry id (ep_...). |
| listed | boolean | yes | true to list it in search, false to unlist it. |
Read the endpoint-registry review queue, newest first. Each entry shows the card AWAITING REVIEW (not the one currently being served) plus who registered it and which origin was mechanically proven. Origin ownership is ALREADY proven before anything reaches this queue — IC fetched the card from a well-known path on that origin and the registrant served a per-member challenge token there — so your
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max entries (default 50). |
Approve the card awaiting review on an endpoint: promotes it to the served card and indexes it for ic_endpoint_search. Two-step like the other operator queues — omit confirm (or pass false) for a dry-run preview that mutates nothing; pass confirm:true to apply. Idempotent: an id with nothing pending returns ok:false. Args: { endpoint_id, confirm? }. Returns: dry-run shape on confirm=false; { ok,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| endpoint_id | string | yes | The registry id (ep_...) from ic_admin_list_pending_endpoints. |
| confirm | boolean | no | Set true to actually apply. When false / omitted, returns a dry-run preview that changes nothing. |
Refuse the card awaiting review on an endpoint, with a note the owner can read via ic_endpoint_get. NON-DESTRUCTIVE to a live listing: if the endpoint already had an approved card, that card KEEPS serving and only the in-flight change is refused (the entry stays 'approved'); an endpoint that was never approved becomes 'rejected'. To take down a live listing, unlist it instead. Two-step: omit `conf
| Parameter | Type | Required | Notes |
|---|---|---|---|
| endpoint_id | string | yes | The registry id (ep_...). |
| note | string | yes | Why it was refused. The owner reads this — make it actionable. |
| confirm | boolean | no | Set true to actually apply. When false / omitted, returns a dry-run preview that changes nothing. |
Fetch the caller's OWN vinyl-figure manifest — the parts to render it, the animation clips they have actually unlocked, and the member stats behind those unlocks. Works whether or not the member has published the figure publicly (this is their own token asking about themselves). The figure is composed at runtime from three parts, not one baked file: parts.body and parts.library are byte-identi
No parameter schema on file.
Fetch a member's published vinyl-figure manifest by handle. PUBLISHED FIGURES ONLY: members are private by default and must opt in. A handle that has not opted in returns exactly the same not_found as a handle nobody ever registered — that is deliberate, and it means you cannot use this tool to test whether a person is a member. Same manifest shape as ic_funko_get_mine (parts not a baked file; `cl
| Parameter | Type | Required | Notes |
|---|---|---|---|
| handle | string | yes | The member's funko handle, e.g. 'rayyan'. Case-insensitive. |
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 { sig
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | no | Optional filter — return only unlocks of this kind. |
The caller's OWN unlock snapshot: every catalog item, whether they have earned it, and per-condition progress so you can say '3 more commits' instead of 'locked'. Read degraded[] FIRST — it lists the signals that could not be read this pass, and any condition resting on one of those is UNKNOWN, not unmet. Telling a member with 400 commits that they need 5 more because GitHub timed out is the spe
No parameter schema on file.
Flip the caller's OWN publicShare switch. TRUE makes their handle, display name, figure parts, unlock set and member stats readable by ANY agent on the internet with no token (via ic_funko_get or a plain GET of /api/funko/m/<handle>); FALSE takes it back, and the endpoint immediately returns the same not_found as an unregistered handle. Default is FALSE — a member is private until they say otherwi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| public_share | boolean | yes | true publishes your figure to the open internet; false makes it private again. |
Take a published figure out of public view: sets publicShare=false and removes the handle from the gallery index, so /api/funko/m/<handle> immediately returns the SAME not_found as a handle that never existed. Accepts a handle or a Clerk user id. IDEMPOTENT — taking down an already-private figure returns ok:true with was_public:false, so a retry after a timeout is safe. DOES NOT DELETE the head GL
| Parameter | Type | Required | Notes |
|---|---|---|---|
| handle | string | yes | The member's funko handle, or their Clerk user id. |
| reason | string | no | Moderator note. Recorded in the audit log — write it for the next operator. |
The undo for ic_admin_funko_takedown: sets publicShare=true and re-lists the handle. This OVERRIDES the member's own switch, so it is audit-logged exactly as heavily as the takedown. REFUSED if the handle has since been claimed by a different member — restoring under a name that now belongs to somebody else would publish one member's figure behind another member's identity. Args: { handle, reason?
| Parameter | Type | Required | Notes |
|---|---|---|---|
| handle | string | yes | The member's funko handle, or their Clerk user id. |
| reason | string | no | Why the takedown is being reversed. |
Add generation allowance to one member. A figure costs real Meshy credits and ~34 minutes, and every member gets ONE free — this is how an operator hands out a re-roll, or makes good after a failed run that still burned the allowance (generationsUsed is incremented before the first paid call and is never refunded automatically, by design: a failed Meshy job still billed). Delta must be 1..25. Writ
| Parameter | Type | Required | Notes |
|---|---|---|---|
| handle | string | yes | The member's funko handle, or their Clerk user id. |
| delta | integer | yes | How many extra generations to grant. 1..25. |
| reason | string | no | Why. Lands in the member's grantLog permanently. |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Immersive Commons or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.34.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Immersive Commons can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.