MCP tools

Every tool an agent can call is listed here, with what it does, whether it reads or writes, its arguments, and an example call. The list is published by the server. If it can't be loaded, the page says so instead of showing an old copy. Connect with one paste from the docs home, using an API key or the scout:read and scout:write scopes.

Start a session

Load what the team is doing before you start: one call at the top of a session.

Read team conventions

scout_get_conventions

The team's shared conventions document, written by the team's members.

Read · scout:read

Arguments

No arguments.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_conventions",
    "arguments": {}
  }
}

Read team focus

scout_get_focus

What this team decided matters most, in the order they decided it, with the reason for each. The tracker's priority is a bucket twenty tickets can share, and this is somebody's actual call inside it. Separate from scout_get_waiting, which is computed rather than declared.

Read · scout:read

Arguments

No arguments.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_focus",
    "arguments": {}
  }
}

Read who is waiting

scout_get_waiting

Who on this team is stopped, what nobody has claimed, and what nobody has taken: the ticket somebody is waiting behind, and the handoff written for whoever came next. Each line says who, what, how long, and what would clear it. Anything that could not be matched exactly is counted rather than guessed at.

Read · scout:read

Arguments

No arguments.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_waiting",
    "arguments": {}
  }
}

Onboard to the workspace

scout_onboard

A full-workspace digest for arriving rather than resuming: every member's current context by type, active shared state, deprecations.

Read · scout:read

Arguments

NameTypeRequiredDescription
daysinteger (≥ 1)NoWindow in days.
include_stalebooleanNoInclude stale entries.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_onboard",
    "arguments": {
      "days": 14
    }
  }
}

Read changes since last bundle

scout_diff

What has changed since this seat last read the session bundle. Does not consume the diff: only reading the bundle advances the cursor. Bounded by tokens as well as by rows, so a workspace with a lot of history returns a readable page rather than everything unread.

Read · scout:read

Arguments

NameTypeRequiredDescription
limitinteger (≥ 1)NoMaximum entries.
token_budgetinteger (≥ 1)NoApproximate token ceiling for the response. Defaults to the session bundle's. Changes past it are withheld and counted.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_diff",
    "arguments": {
      "limit": 50
    }
  }
}

Load session bundle

scout_session_bundle

Everything needed to start a session in one call: conflicts, team rules, deprecations, what changed since you last looked, teammate state, contracts, handoffs and open work. Advances this seat's cursor. Takes no cursor. It is bounded by tokens rather than by rows, and it composes many types, so 'the next page' has no single meaning here — the second page of a bundle would be a different mix of sections, not older rows. When the budget cuts a section it says so in that section. To read past what it showed, call the typed reader for that type and page it.

Read · scout:read

Arguments

NameTypeRequiredDescription
token_budgetinteger (≥ 1)NoApproximate token ceiling for the response.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_session_bundle",
    "arguments": {
      "token_budget": 8000
    }
  }
}

Resume a loop or handoff

scout_resume

One brief to carry a loop or a handoff on without its transcript: the anchor's goal, owner, status and resume text; what must be settled first; open blockers; the last handoff; decisions, deprecations and lessons on its subjects; the team's now, wip and plan for them; and the loop's history. A finished loop comes back labelled history. Pass loop:<id>, a bare loop id, a handoff's entry id, a ticket key such as CAS-123, or a pull request as owner/repo#n, repo#n or #n. A ticket or pull request resumes from Scout's own dated snapshot, never a live tracker call. Reads only and claims nothing: to take a handed-off loop over, read this, then call scout_loop_claim. Moves no cursor. Off until a workspace admin turns it on. History filed under a renamed repository is not found.

Read · scout:read

Arguments

NameTypeRequiredDescription
refstringYesloop:<id>, a loop id, a handoff entry id, a ticket key such as CAS-123, or a pull request as owner/repo#n, repo#n or #n.
kindstring (loop | handoff | ticket | pr)Noloop, handoff, ticket or pr, when the ref alone is ambiguous (a loop id can look like a ticket key). Omit to infer.
token_budgetinteger (≥ 1)NoApproximate token ceiling for the response. Default 6000.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_resume",
    "arguments": {
      "ref": "loop:a1b2c3d4",
      "token_budget": 6000
    }
  }
}

Record work

Write what you're doing, deciding and learning, so the next session and your teammates' agents can read it.

Append an entry

scout_write

Append an entry to the shared record. Every entry is attributed to your credential and is immutable once written; correct one by writing a replacement that supersedes it. A contract or decision on a subject replaces your own latest one of that type on that subject, so each is one current fact per author; a second fact that should also stand goes under its own subject. tickets and prs entries on one subject are a timeline whoever wrote them.

Write · scout:write

Arguments

NameTypeRequiredDescription
typestring (wip | plans | contracts | decisions | lessons | handoffs | tape | team_decisions | tickets | prs | blockers | deprecations | ready | violations)YesEntry type.
bodystringYesThe entry text. Free-form prose.
subjectstringNoWhat this entry is about: a short, stable name for the thing itself, like 'auth-tokens' or 'payments-webhook'. You choose it and nothing derives it. Two agents using different strings for the same thing will not see each other's conflicts, so prefer a name a teammate would have picked. Required for tickets, prs and ready: each of those is one item with a lifecycle, and the readers that answer what is open key on this, so a write without it is refused rather than accepted and left unreadable. Optional on blockers, where having no subject means you are stuck and cannot yet say on what.
supersedesstringNoEntry id this replaces. Must be the same type and subject. Optional for contracts and decisions: with a subject and no id, the new entry replaces your own latest one of that type on that subject, and the result names it.
visibilitystring (workspace | private)Noworkspace shares it; private keeps it to this member.
retention_classstring (standard | ephemeral | regulated)NoHow long this is kept.
idempotency_keystringNoYour own key for this write. Replaying the same key returns the original entry instead of writing a second one.
repositorystringNoThe repository this entry concerns, like github.com/acme/api. Optional. If it names a repository outside this workspace's connected ones, the result says so; the write still goes through either way.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_write",
    "arguments": {
      "type": "decisions",
      "subject": "auth-tokens",
      "body": "Session tokens are hashed at rest. A stolen row is not a usable cookie."
    }
  }
}

Supersede an entry

scout_supersede

Replace an entry with a corrected one. The replacement inherits the predecessor's type and subject: a supersession corrects one subject's current value, so it cannot move to a different subject. This is how you resolve a conflict: supersede the value that is wrong rather than writing a third one.

Write · scout:write

Destructive

Arguments

NameTypeRequiredDescription
entry_idstringYesThe entry being replaced.
contentstringYesThe corrected text.
visibilitystring (workspace | private)Noworkspace shares it; private keeps it to this member.
retention_classstring (standard | ephemeral | regulated)NoHow long this is kept.
idempotency_keystringNoYour own key for this write. Replaying the same key returns the original entry instead of writing a second one.
repositorystringNoThe repository this entry concerns, like github.com/acme/api. Optional. If it names a repository outside this workspace's connected ones, the result says so; the write still goes through either way.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_supersede",
    "arguments": {
      "entry_id": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01",
      "content": "Session tokens are hashed with SHA-256 at rest."
    }
  }
}

Rank a focus ticket

scout_rank

Say which ticket the team should do first, and why. A tracker gives you a bucket — twenty tickets can all be Urgent — and this is the ordering inside it. The reason is required: a ranking nobody can argue with is one nobody revisits. Ranking a ticket already in the set moves it, keeping the previous call in the log. The set is capped, and a call past the cap is refused with what to drop rather than silently dropping the tail.

Write · scout:write

Arguments

NameTypeRequiredDescription
identifierstringYesThe ticket, as the tracker writes it. Example: CAS-719.
positionintegerYesWhere in the order, starting at 1.
rationalestringYesWhy this one. Required.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_rank",
    "arguments": {
      "identifier": "CAS-719",
      "position": 1,
      "rationale": "It blocks the release."
    }
  }
}

Set current working state

scout_set_now

Set your current working state. One screen, rewritten each time, and only the sections you pass change.

Write · scout:write

Destructive

Arguments

NameTypeRequiredDescription
resumestringNoWhere to pick the thread back up.
betstringNoWhat you are betting on right now.
ruled_outstringNoWhat you have eliminated.
openstringNoWhat is still unresolved.
pick_up_atstringNoThe exact next step.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_set_now",
    "arguments": {
      "bet": "The token refresh race is in the retry path, not the cache.",
      "pick_up_at": "Add a test for two refreshes in one second, then read retry.py."
    }
  }
}

Append a tape line

scout_tape

Append one line of narration: a hypothesis, a dead end, a decision, where you resumed, or something left open. Append-only.

Write · scout:write

Arguments

NameTypeRequiredDescription
kindstring (dead-end | decision | hypothesis | open | resume)YesWhat kind of line this is.
bodystringYesOne line, 240 characters at most.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_tape",
    "arguments": {
      "kind": "dead-end",
      "body": "Raising the cache TTL didn't help."
    }
  }
}

Read the team's record

Read one kind of entry across the team, one entry, or search the whole record.

Read work in progress

scout_get_wip

The most recent work-in-progress entry for every team member, or one member if you name them: what teammates are actively building.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_wip",
    "arguments": {
      "since_days": 7
    }
  }
}

Read interface contracts

scout_get_contracts

Interface contract changes the team has recorded: API, DB, ENV and MODEL.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_contracts",
    "arguments": {
      "since_days": 30,
      "limit": 20
    }
  }
}

Read decisions

scout_get_decisions

Architectural decisions and the reasoning behind them, per member.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_decisions",
    "arguments": {
      "since_days": 30
    }
  }
}

Read lessons

scout_get_lessons

Things that cost the team time and would cost it again.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_lessons",
    "arguments": {
      "limit": 20
    }
  }
}

Read plans

scout_get_plans

Implementation plans other members are working to.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_plans",
    "arguments": {
      "limit": 10
    }
  }
}

Read team decisions

scout_get_team_decisions

Team-wide decisions that apply to everyone, distinct from any one member's personal decisions.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_team_decisions",
    "arguments": {
      "since_days": 90
    }
  }
}

Read blockers

scout_get_blockers

Who is blocked and what would unblock them. Resolved blockers are not listed.

Read · scout:read

Arguments

NameTypeRequiredDescription
limitinteger (≥ 1)NoMaximum entries.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_blockers",
    "arguments": {
      "limit": 20
    }
  }
}

Read ready work

scout_get_ready

Work that is ready to be picked up. Items already taken are not listed.

Read · scout:read

Arguments

NameTypeRequiredDescription
limitinteger (≥ 1)NoMaximum entries.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_ready",
    "arguments": {}
  }
}

Read tickets

scout_get_tickets

Tickets the team is tracking. Closed tickets are not listed.

Read · scout:read

Arguments

NameTypeRequiredDescription
limitinteger (≥ 1)NoMaximum entries.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_tickets",
    "arguments": {
      "limit": 50
    }
  }
}

Read pull requests

scout_get_prs

Pull requests the team is tracking. Merged or closed ones are not listed.

Read · scout:read

Arguments

NameTypeRequiredDescription
limitinteger (≥ 1)NoMaximum entries.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_prs",
    "arguments": {
      "limit": 20
    }
  }
}

Read the tape

scout_get_tape

Append-only narration of real state changes: hypotheses, dead ends, decisions, and where to resume.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_tape",
    "arguments": {
      "since_days": 3
    }
  }
}

Read current working state

scout_get_now

Every member's current working state, one screen each. A state nobody has touched recently is returned flagged as stale rather than hidden.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_now",
    "arguments": {}
  }
}

Read one entry

scout_get_entry

One entry by id: its type, subject, author, when, what it replaced, what replaced it, and its full text. Use it on the ids a conflict names before deciding which one holds.

Read · scout:read

Arguments

NameTypeRequiredDescription
entry_idstringYesThe entry id.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_entry",
    "arguments": {
      "entry_id": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01"
    }
  }
}

Read agent sessions

scout_get_sessions

What a teammate's agent read from and wrote to Scout, from any harness: when it connected, what it did, whether calls succeeded, and the writes it made. Off until a workspace admin turns it on.

Read · scout:read

Arguments

NameTypeRequiredDescription
teammatestringNoHandle or member id. Omit for everyone.
sincestringNoISO timestamp with a timezone offset. Only sessions active since then. Omit for the last 7 days.
limitinteger (≥ 1)NoMaximum sessions.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_sessions",
    "arguments": {
      "since": "2026-10-05T00:00:00+00:00",
      "limit": 10
    }
  }
}

Hand off and pick up

Leave work for someone else to finish, pick up what was left, and keep a long agent loop resumable.

Read handoffs

scout_get_handoffs

Open handoffs between members and sessions, each with its entry id and state: open, or stale (open past the workspace's stale period). include_closed lists the ended ones too, as expired, completed or superseded (replaced by a later handoff). scout_handoff_complete takes the id; scout_handoff_reopen takes a closed one's.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.
include_closedbooleanNoAlso list completed and expired handoffs, each marked with its state, so one can be found by id. Off by default: only open ones.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_handoffs",
    "arguments": {
      "since_days": 14
    }
  }
}

Read open loops

scout_get_loops

Every open agent loop you can see: whose it is, the client running it, its goal, what it's on, its status and where to resume. A handed-off loop can be claimed with scout_loop_claim.

Read · scout:read

Arguments

NameTypeRequiredDescription
loop_idstringNoOne loop. Omit for all.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_loops",
    "arguments": {}
  }
}

Write a handoff

scout_handoff

Write a handoff for another session or teammate to pick up. Pass ticket (like CAS-123) so it ends when the ticket closes, or expires_in (like 3d) to say how long it stands. With neither it expires in 14 days. A new handoff on the same subject replaces your earlier open one.

Write · scout:write

Arguments

NameTypeRequiredDescription
bodystringYesWhat you are handing over.
subjectstringNoWhat this entry is about: a short, stable name for the thing itself, like 'auth-tokens' or 'payments-webhook'. You choose it and nothing derives it. Two agents using different strings for the same thing will not see each other's conflicts, so prefer a name a teammate would have picked. Required for tickets, prs and ready: each of those is one item with a lifecycle, and the readers that answer what is open key on this, so a write without it is refused rather than accepted and left unreadable. Optional on blockers, where having no subject means you are stuck and cannot yet say on what.
ticketstringNoThe tracker ticket this handoff belongs to, like CAS-123. The handoff ends when the ticket closes.
expires_instringNoHow long the handoff stands: hours, days or weeks, like 3h, 3d or 3w. At least 1 hour, at most 14 days. Without a ticket or an expiry, 14 days.
visibilitystring (workspace | private)Noworkspace shares it; private keeps it to this member.
retention_classstring (standard | ephemeral | regulated)NoHow long this is kept.
idempotency_keystringNoYour own key for this write. Replaying the same key returns the original entry instead of writing a second one.
repositorystringNoThe repository this entry concerns, like github.com/acme/api. Optional. If it names a repository outside this workspace's connected ones, the result says so; the write still goes through either way.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_handoff",
    "arguments": {
      "subject": "billing-webhooks",
      "ticket": "CAS-123",
      "body": "Signature check is done and tested. Next: replay protection in webhooks.py, the timestamp window is the open question."
    }
  }
}

Mark a plan complete

scout_plan_done

Mark one of your plans complete. Records a transition, not an edit.

Write · scout:write

Arguments

NameTypeRequiredDescription
entry_idstringYesThe plan's entry id.
notestringNoOptional closing note.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_plan_done",
    "arguments": {
      "entry_id": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01",
      "note": "Merged in #412."
    }
  }
}

Mark a handoff complete

scout_handoff_complete

Mark a handoff complete. Completing one twice is refused: the second caller is told, rather than both believing they closed it.

Write · scout:write

Arguments

NameTypeRequiredDescription
entry_idstringYesThe handoff's entry id.
notestringNoOptional closing note.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_handoff_complete",
    "arguments": {
      "entry_id": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01",
      "note": "Picked up and shipped."
    }
  }
}

Reopen a closed handoff

scout_handoff_reopen

Reopen a completed or expired handoff as a new one that replaces it, keeping its subject, body and ticket, with a fresh expiry when it had one. Say why. scout_get_handoffs with include_closed lists the ids.

Write · scout:write

Arguments

NameTypeRequiredDescription
entry_idstringYesThe closed handoff's entry id.
reasonstringYesWhy it is open again.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_handoff_reopen",
    "arguments": {
      "entry_id": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01",
      "reason": "The replay-protection PR was reverted."
    }
  }
}

Start or update a loop

scout_set_loop

Record a long agent loop so you, a teammate or another agent can pick it up later: its goal, what it's working on, and where to resume. Omit loop_id to start one; pass it to update your own, and only what you pass changes. Use this rather than scout_set_now when you run more than one loop or want someone else able to take it over.

Write · scout:write

Arguments

NameTypeRequiredDescription
loop_idstringNoThe loop to update. Omit to start a new one.
goalstringNoWhat the loop is for. 200 max.
working_onstringNoWhat it's on right now. 500 max.
statusstring (running | paused | blocked)Norunning, paused or blocked.
clientstringNoThe agent running it. Defaults to your connection's.
resumestringNoWhere to pick it back up, in prose. 4,000 max.
visibilitystring (workspace | private)Noworkspace (default) or private. Set when starting.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_set_loop",
    "arguments": {
      "goal": "Move every route to the typed client.",
      "working_on": "The billing routes.",
      "status": "running"
    }
  }
}

Hand a loop off

scout_loop_handoff

Mark a loop handed off so somebody else can claim it, and tell the team in the open handoffs. A private loop becomes visible. An admin can hand off somebody else's loop, with a reason.

Write · scout:write

Destructive

Arguments

NameTypeRequiredDescription
loop_idstringYesThe loop.
reasonstringNoWhy, for whoever picks it up.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_loop_handoff",
    "arguments": {
      "loop_id": "9c4e1a7b-2d3f-4a5b-8c6d-1e2f3a4b5c6d",
      "reason": "Out of budget for today."
    }
  }
}

Claim a loop

scout_loop_claim

Take over a handed-off loop. It becomes yours, and you get its goal and resume text back.

Write · scout:write

Arguments

NameTypeRequiredDescription
loop_idstringYesThe loop.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_loop_claim",
    "arguments": {
      "loop_id": "9c4e1a7b-2d3f-4a5b-8c6d-1e2f3a4b5c6d"
    }
  }
}

Finish a loop

scout_loop_done

Mark a loop done. It leaves every open list and its history stays readable. The owner or an admin.

Write · scout:write

Arguments

NameTypeRequiredDescription
loop_idstringYesThe loop.
notestringNoOptional closing note.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_loop_done",
    "arguments": {
      "loop_id": "9c4e1a7b-2d3f-4a5b-8c6d-1e2f3a4b5c6d",
      "note": "All routes typed."
    }
  }
}

Conflicts and deprecations

Check before you build: overlapping work, contested decisions, and patterns the team has retired.

Read deprecations

scout_get_deprecations

Patterns, libraries and endpoints the team has deprecated, with what to use instead. Each carries its entry id, which is what scout_deprecation_resolve takes to retire one.

Read · scout:read

Arguments

NameTypeRequiredDescription
memberstringNoHandle or member id. Omit for everyone.
since_daysinteger (≥ 1)NoOnly entries from the last N days. Omit for no window.
limitinteger (≥ 1)NoMaximum entries.
include_stalebooleanNoInclude work-in-progress the workspace considers stale.
cursorstringNoContinue a previous call. Pass the value this tool printed under 'More entries exist'. Omit it for the newest page. A cursor from a different tool or a different workspace is refused.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_get_deprecations",
    "arguments": {}
  }
}

Record a deprecation

scout_deprecate

Mark a pattern, library or endpoint as deprecated. Must name what replaces it: a deprecation with no replacement leaves the next agent knowing the old thing is gone and not what to use.

Write · scout:write

Arguments

NameTypeRequiredDescription
namestringYesThe deprecated thing.
replacementstringYesWhat to use instead.
reasonstringYesWhy, specifically.
visibilitystring (workspace | private)Noworkspace shares it; private keeps it to this member.
retention_classstring (standard | ephemeral | regulated)NoHow long this is kept.
idempotency_keystringNoYour own key for this write. Replaying the same key returns the original entry instead of writing a second one.
repositorystringNoThe repository this entry concerns, like github.com/acme/api. Optional. If it names a repository outside this workspace's connected ones, the result says so; the write still goes through either way.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_deprecate",
    "arguments": {
      "name": "moment.js",
      "replacement": "date-fns",
      "reason": "Moment is in maintenance mode and adds 70 KB to the bundle."
    }
  }
}

Retire a deprecation

scout_deprecation_resolve

Stop a deprecation warning, naming what replaces it. The record stays and the scan stops matching it, so a deprecation written by mistake can be taken back. Entry ids come from scout_get_deprecations.

Write · scout:write

Destructive

Arguments

NameTypeRequiredDescription
entry_idstringYesThe deprecation's entry id.
replacementstringYesWhat to use instead, or why it no longer applies.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_deprecation_resolve",
    "arguments": {
      "entry_id": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01",
      "replacement": "Every use moved to date-fns in #388."
    }
  }
}

List contested subjects

scout_conflicts

Subjects the workspace disagrees with itself about, with the entry id of each competing value so you can supersede one directly. A conflict is two members' differing current entries of one type on one subject. One author's own wip and now are a timeline, tickets and prs are a timeline whoever wrote them, and your own newer contract or decision replaces your earlier one on write, so none of those are listed. This is the record, not a guess: for a heuristic about who is working where, use scout_check_conflicts.

Read · scout:read

Arguments

No arguments.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_conflicts",
    "arguments": {}
  }
}

Settle a conflict

scout_settle

End a conflict by keeping the entry that holds. Every other current entry of its type on its subject is retired, and your reason is recorded. Read the entries with scout_get_entry first. Unlike scout_supersede, this writes no new value, so the conflict actually clears.

Write · scout:write

Destructive

Arguments

NameTypeRequiredDescription
keepstringYesThe id of the entry that holds.
reasonstringYesWhy it holds and the others don't. Recorded once.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_settle",
    "arguments": {
      "keep": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01",
      "reason": "The newer decision has the benchmark behind it."
    }
  }
}

Check for deprecations

scout_check_deprecations

Checks a described change against the team's deprecations and returns any matches, with what to use instead. Returns nothing when there is no confident match.

Read · scout:read

Arguments

NameTypeRequiredDescription
intentstringYesWhat you are about to do, or the diff you are about to write.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_check_deprecations",
    "arguments": {
      "intent": "Add a date picker with moment.js to the settings page."
    }
  }
}

Check for work conflicts

scout_check_conflicts

Heuristic: is anyone else working where you are? Compares your work-in-progress against your teammates' by branch, ticket, file path and shared rare keywords (field labels and words in most entries are ignored). This is a guess over free text. For contested subjects in the record itself, use scout_conflicts.

Read · scout:read

Arguments

NameTypeRequiredDescription
branchstringNoYour current branch, if you have not written a wip yet.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_check_conflicts",
    "arguments": {
      "branch": "eric/token-refresh"
    }
  }
}

Clear and confirm

Close out blockers and ready items, and confirm or dismiss what Scout observed.

Clear a blocker or a ready item

scout_resolve

Clear a "stopped on" note or a ready item once it is no longer true, with every open copy of it by the same person on the same ticket. Only the person who wrote it or a workspace admin can. The entry stays in the log and stops showing in waiting, blockers, ready and attention. Entry ids come from scout_get_waiting, scout_get_blockers and scout_get_ready.

Write · scout:write

Destructive

Arguments

NameTypeRequiredDescription
entry_idstringYesThe blocker's or ready item's entry id.
notestringNoOptional: why it is cleared.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_resolve",
    "arguments": {
      "entry_id": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01",
      "note": "The staging key was rotated."
    }
  }
}

Confirm or dismiss an observation

scout_confirm

Rule on a watcher's observation. Confirming promotes a machine guess to something a human has stood behind; dismissing retains it and excludes it from the shared view.

Write · scout:write

Arguments

NameTypeRequiredDescription
entry_idstringYesThe observation's entry id.
actionstring (confirm | dismiss)Noconfirm to promote it, dismiss to set it aside.
notestringNoOptional note.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scout_confirm",
    "arguments": {
      "entry_id": "5d2f9a10-3c4b-4e8f-a1d2-7b6c5e4f3a20",
      "action": "confirm"
    }
  }
}