Perlance

Perlance connector reference

The master for everything Claude and people need to use Perlance from Claude. The docs site at https://docs.perlanceai.com (the reference and the setup kit) and the app's "Connect Claude" card are built from this file, and npm test fails if it and the live service disagree (tests/connector-doc.test.ts). Change the code and this file together.

1. The address

Paste this into Claude as a custom connector:

https://api.perlanceai.com/mcp

Signing in. The first time Claude uses the connector, it opens a Perlance sign-in page. Choose Google and sign in with your work Google account, the one your Perlance admin added. You do this once per Claude account; Claude renews the sign-in by itself. Perlance never sees your password.

Being refused. Every refusal comes back as a sentence that says what is wrong and who can fix it. Claude should read it to you as given. Refusals about your account (not part of any organisation, removed, domain not allowed, suspended) are fixed by your Perlance admin. Refusals about a role (no route, not the lead, a stale save) are fixed by doing what the sentence says, or by the lead of the node. "Something went wrong inside Perlance" means the service failed: try again, and tell your Perlance admin if it keeps happening.

Refusals any action can give, in the service's words (names in braces are filled in):

**Refusals any action after open_seat can give** (they all carry seatId and session):

2. The actions

Fifteen, in the order Claude meets them. Every action runs the same five checks (who, which org, which person, may they, do it and record it), and every change is recorded by the service with who and when (R-11).

whoami

For: checking which account Perlance has signed you in as.

Inputs

None.

Returns

The email address, as text.

Refusals

Only the ones any action can give.

Rules

Read only. Nothing is recorded.

my_seats

For: the start of every chat. Lists the roles you hold, so you can choose one to open.

Inputs

None.

Returns

own: one entry per role you hold, with seatId, role, node, lead (true for a node's lead role), state (needs you, at risk or calm), reason (one line), openItems (how many items are open for it) and needsPerson (what the role needs a person for, or null). visitable: other roles you may open, empty until the four routes are built.

Refusals

Only the ones any action can give.

Rules

Read only. A role's state is worked out at the time of asking from its open items and the organisation's thresholds.

open_seat

For: opening one role for this chat. Read everything it returns before doing anything else.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe role to open, from my_seats.

Returns

In this order: session (the handle every later action needs); seat (role, node, nodeId, lead); nodeContexts (the shared contexts from the root down to this role's node, each with its four parts, marker and age in days); yourNodeContext (lead roles only: how old the node's context is and who saved it); workingRules (section 3); brief (the Role Brief and its links); context (this role's private working context, its marker and word count); state; openItems and waitingOn (one-line summaries); board (lead roles only: the roles directly beneath, with states and counts); skillDocs; history (how many earlier context versions and log entries exist); warnings (an earlier session never logged, a context or node context over its limit).

Refusals

Rules

Checks your route into the role (R-13) and starts a session, which is recorded. One role per chat. Never returns any other role's private context.

save_context

For: saving this role's private working context whenever something meaningful changes.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
markerintegeryesThe context's marker from open_seat or the last save.
currentStatestringyesWhere the work stands.
inProgressstringyesWhat is under way.
decisionsstringyesDecisions made, with dates.
openQuestionsstringyesWhat is still open.
condensingobject {note: string}noWhen the save shortens the context: a one-line note of what was condensed.

Returns

The new marker and the wordCount.

Refusals

Rules

Version-checked in one step (R-09): a stale marker never overwrites. The earlier version is always kept (R-10).

save_node_context

For: a node's lead writing the shared context everyone in and beneath the node reads.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role: the node's lead role.
sessionstringyesThe handle from open_seat.
nodeIdstringyesThe node, which must be the open role's own node.
markerintegeryesThe node context's marker from open_seat or the last save.
currentStatestringyesWhere the group's work stands.
inProgressstringyesWhat is under way.
decisionsstringyesDecisions that affect the group.
openQuestionsstringyesWhat is still open for the group.
condensingobject {note: string}noWhen the save shortens the context: a one-line note.

Returns

marker, wordCount, overLimit (over 600 words) and warning (or null).

Refusals

Rules

Lead roles only, own node only. Version-checked like save_context; every version kept. Over 600 words the save succeeds and is flagged.

log_session

For: the end of every chat. What was done and what is next.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
donestringyesWhat was done in this session.
nextstringyesWhat is next. May be empty.

Returns

logged: true.

Refusals

Rules

One log entry per session, add-only (R-10). It also stops the warning about your earlier unlogged sessions on this role. A session that saved without a log is flagged to the next person who opens the role.

send_down

For: a lead sending an instruction, or a note, to a role beneath its node.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role: a lead role.
sessionstringyesThe handle from open_seat.
tostringyesThe role it is for, beneath this node, at any depth.
kindone of instruction, notenoInstruction unless said.
summarystringyesOne line, shown in lists.
bodystringyesThe full text, read only with read_item.
linksurl[]noGoogle Drive or other links.
priorityone of high, normal, lownoNormal unless said.
duedatenoYYYY-MM-DD.
partOfstringnoAn open instruction for this role that this one is a part of.

Returns

itemId and path (the roles it travels through).

Refusals

Rules

Only leads instruct. Both roles keep the item; every lead in between sees it on their board. Recorded, add-only events (R-10).

raise_up

For: a question or a blocker for the lead above, or any lead higher up.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
tostringnoA lead role above. Your own lead unless said.
kindone of question, blockeryesA blocker turns the lead's role to "needs you".
summarystringyesOne line.
bodystringyesThe full text.
linksurl[]noLinks.
priorityone of high, normal, lownoNormal unless said.
duedatenoYYYY-MM-DD.

Returns

itemId, to (the role it went to) and path.

Refusals

Rules

A question always has an owner. The answer comes back along the recorded path.

add_note

For: a note to a peer in the same node, to the lead above, or to a role beneath; or a question to a peer.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
tostringyesThe role it is for.
kindone of note, questionnoNote unless said. A question only to a peer.
summarystringyesOne line.
bodystringyesThe full text.
linksurl[]noLinks.

Returns

itemId and path.

Refusals

Rules

Never an instruction. Across nodes only through the leads.

read_item

For: one item's full text and history, when you work on it. Lists only ever show one-line summaries.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
itemIdstringyesThe item, from openItems or waitingOn.

Returns

The item's summary, kind, status, priority, due date, from, to, path, what it answers or is part of, its full text and links, and its events (who did what, when).

Refusals

Rules

Read only. Bodies are fetched one at a time, never in lists. Becomes look_up with kind item when look_up is built (phase 4).

complete_item

For: finishing an instruction, a note or a result that is for this role.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
itemIdstringyesThe item.
summarystringnoOne line for the result. "Done: ..." unless said.
resultstringnoWhat was done. Needed for an instruction: it goes back to the sender.

Returns

itemId and resultItemId (the result sent back, or null).

Refusals

Rules

The result returns to the sender along the path the instruction came. Nothing is overwritten; the change is an add-only event (R-10).

cancel_item

For: the sender withdrawing an item, with every unfinished part split from it.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role: the one that sent the item.
sessionstringyesThe handle from open_seat.
itemIdstringyesThe item.
reasonstringnoWhy.

Returns

cancelled (the item and its unfinished parts) and kept (parts already finished).

Refusals

Rules

Finished parts stay finished. Every cancellation is an add-only event.

answer_item

For: answering a question or a blocker that is for this role.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
itemIdstringyesThe question or blocker.
summarystringnoOne line for the answer. "Answer: ..." unless said.
answerstringyesThe answer.

Returns

itemId, resultItemId (the answer sent back) and path.

Refusals

Rules

The answer returns to the asker along the recorded path, through every role it passed.

pass_up

For: passing a question or blocker for this role one more level up.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
itemIdstringyesThe question or blocker.
tostringnoA lead role above. The next one up unless said.
notestringnoWhy it is passed up.

Returns

itemId, to and path.

Refusals

Rules

The item's owner moves up; the answer still comes back down the same path.

flag_needs_person

For: marking that this role needs a person (a sign-off, an access, a decision only a human can give), or clearing that mark.

Inputs

InputTypeRequiredWhat it is
seatIdstringyesThe open role.
sessionstringyesThe handle from open_seat.
whatstringnoWhat is needed. Needed unless clearing.
fromstringnoFrom whom. Needed unless clearing.
cleartruenoClears the mark.

Returns

needsPerson (what and from whom, or null once cleared).

Refusals

Rules

Marks only the open role (R-19). A flagged role shows as "needs you".

3. The working rules

open_seat returns the organisation's working rules from its settings. New organisations start with this text, and Threadwell Labs was given it on 2026-10-15:

Work this role as its holder would. Read the shared contexts and the brief before acting. Save the context when something meaningful changes and before any long step. Keep the private context under the word limit; condense it when warned and mark the save as condensing. Log the session before stopping. Raise blockers up rather than guessing. If you lead this node, promote decisions, dates and client facts to the node context.

4. The Claude setup kit

On its own page: the setup kit.

5. Change log

DateWhat changedReconnect?
2026-10-15First version: fifteen actions (whoami through flag_needs_person, with read_item from PR-018), the default working rules, the setup kit.No
2026-10-15The pages move to https://docs.perlanceai.com (PR-023); the project instructions and the starting file say what open_seat and add_note actually do. People who already pasted the instructions or added the starting file should replace them.No