For AI agents: a documentation index is available at https://www.plungeai.com/docs/llms.txt. Append .md to any page URL, or send Accept: text/markdown, to get markdown. Setup instructions for agents are at https://www.plungeai.com/docs/agents.md. One ozk_ key opens every plane, models included.

Documentation Index: fetch the complete documentation index at /llms.txt. Use this file to discover all available pages before exploring further.

Source: orchestration/mcp-gateway/tools-companies.ts (CompaniesSchema, plungeaiCompanies), orchestration/mcp-gateway/ops/companies.ts (decideGate), orchestration/mcp-gateway/shared.ts (refusalResult, valueResult), orchestration/company-service/contract.ts (CompanyServiceApi, the request and response types), orchestration/api-gateway/routes/companies.ts (the REST twin).

A company is a campus compiled from documents you saved as workflows: one kind: campus document, its kind: building documents and their offices. plungeai_companies is the MCP door to it, action for action the One API's /v1/companies: the same company-service, called as you, with the same bodies and the same refusals. Full parameter table: 14.21.

16.1 Tenancy

The key's user is the tenant. Every action but list takes campus (the slug of a campus you saved), and company-service only finds campuses you own: a campus another account owns is the same not_found as one that does not exist, so the answer never tells you that a slug is taken. A slug that cannot be a campus slug (lowercase letters, digits and dashes, 1–63 characters) is not_found without a call.

16.2 Actions

actionNeedsREST twinDoes
listnothingGET /v1/companiesyour campuses: slug, name, mode, status, buildings, pending gates
applycampusPOST /v1/companies/{campus}/applycompiles the saved documents and stores the plan; idempotent by name
layoutcampusGET …/layoutthe compiled campus, buildings and offices
snapshotcampusGET …/snapshotlive state: offices, items, the queue of pending gates, spend today
eventscampus; optional since (default 0), limit (default 200, max 1,000)GET …/events (JSON page)the event log after since, oldest first. The server-sent stream is REST only
ingestcampus, events (1–200)POST …/eventsa local building reports its events up
slicecampus, buildingGET …/buildings/{building}/slicethe part of the plan one building runs
item_createcampus, building, title; optional body, kind, priority, tierPOST …/itemsputs an item through the building
item_pause, item_resume, item_retry, item_cancelcampus, item_idPOST …/items/{id}/{verb}moves one item
item_steercampus, item_id, textPOST …/items/{id}/steera message for the item's running office
approvalscampus; optional statusGET …/approvalsthe gates at the door
decidecampus, approval_id, decision; optional notePOST …/approvals/{ap}records the decision; see 16.3
modecampus, modePUT …/modesupervised, tiered or autonomous: who decides the gates
start, stopcampusPOST …/start, POST …/stoparms or stops the campus clock
deletecampusDELETE /v1/companies/{campus}deletes the campus and every row of it; the saved documents stay, so it can be applied again

16.3 Deciding a gate

Only send decide after the user decided. For a tool_permission gate, approve continues the execution that paused for it, once, as you, and hands the result back to the company so the item moves on: the answer carries execution_id and continued: true. A continue that cannot run is reported beside the recorded decision (continued: false with continue_error: not_paused, session_expired, execution_not_found or continue_failed), never raised. reject leaves the run paused: nothing is continued.

16.4 Answers and refusals

An answer is a heading line (for example Created item `<id>` on `<campus>`.) and the REST response body as a JSON block; the same body is structuredContent. A refusal is isError: true text <word>: <message> (<code>), and structuredContent.error is {status, code, message}:

status wordREST statusTypical codes
invalid400, 422invalid_params (a missing or malformed argument; no call is made)
not_found404company_not_found, building_not_found, item_not_found, approval_not_found
conflict409conflict (delete while the campus runs — stop it first), item_done, approval_not_pending
unavailable5xxnot_enabled (no company service on this deployment), upstream_error (the call failed; retry)

Try asking:

  • "Which companies do I have?" → list
  • "Add an item to the docs building: write the onboarding guide." → item_create
  • "What is waiting for my approval at plunge?" → approvals, then decide once the user says so
  • "Shut plunge down and delete it." → stop, then delete

List your companies (read-only):

curl -s https://mcp.plungeai.com/v1 \
  -H "Authorization: Bearer $PLUNGE_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"plungeai_companies","arguments":{"user_request":"which companies do I have?","action":"list"}}}'

Put an item through a building. This changes state (not verified here):

curl -s https://mcp.plungeai.com/v1 \
  -H "Authorization: Bearer $PLUNGE_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"plungeai_companies","arguments":{"user_request":"have the docs building write the onboarding guide","action":"item_create","campus":"<campus slug>","building":"<building slug>","title":"Write the onboarding guide","kind":"docs"}}}'

Planned: TI-34

The docs assistant is not available yet. You can hand these docs to your own assistant instead.