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.
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": {}
}
}
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": {}
}
}
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": {}
}
}
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
| Name | Type | Required | Description |
|---|
| days | integer (≥ 1) | No | Window in days. |
|---|
| include_stale | boolean | No | Include stale entries. |
|---|
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "scout_onboard",
"arguments": {
"days": 14
}
}
}
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
| Name | Type | Required | Description |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| token_budget | integer (≥ 1) | No | Approximate 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
}
}
}
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
| Name | Type | Required | Description |
|---|
| token_budget | integer (≥ 1) | No | Approximate token ceiling for the response. |
|---|
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "scout_session_bundle",
"arguments": {
"token_budget": 8000
}
}
}
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
| Name | Type | Required | Description |
|---|
| ref | string | Yes | loop:<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. |
|---|
| kind | string (loop | handoff | ticket | pr) | No | loop, handoff, ticket or pr, when the ref alone is ambiguous (a loop id can look like a ticket key). Omit to infer. |
|---|
| token_budget | integer (≥ 1) | No | Approximate 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.
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
| Name | Type | Required | Description |
|---|
| type | string (wip | plans | contracts | decisions | lessons | handoffs | tape | team_decisions | tickets | prs | blockers | deprecations | ready | violations) | Yes | Entry type. |
|---|
| body | string | Yes | The entry text. Free-form prose. |
|---|
| subject | string | No | What 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. |
|---|
| supersedes | string | No | Entry 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. |
|---|
| visibility | string (workspace | private) | No | workspace shares it; private keeps it to this member. |
|---|
| retention_class | string (standard | ephemeral | regulated) | No | How long this is kept. |
|---|
| idempotency_key | string | No | Your own key for this write. Replaying the same key returns the original entry instead of writing a second one. |
|---|
| repository | string | No | The 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| entry_id | string | Yes | The entry being replaced. |
|---|
| content | string | Yes | The corrected text. |
|---|
| visibility | string (workspace | private) | No | workspace shares it; private keeps it to this member. |
|---|
| retention_class | string (standard | ephemeral | regulated) | No | How long this is kept. |
|---|
| idempotency_key | string | No | Your own key for this write. Replaying the same key returns the original entry instead of writing a second one. |
|---|
| repository | string | No | The 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| identifier | string | Yes | The ticket, as the tracker writes it. Example: CAS-719. |
|---|
| position | integer | Yes | Where in the order, starting at 1. |
|---|
| rationale | string | Yes | Why 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| resume | string | No | Where to pick the thread back up. |
|---|
| bet | string | No | What you are betting on right now. |
|---|
| ruled_out | string | No | What you have eliminated. |
|---|
| open | string | No | What is still unresolved. |
|---|
| pick_up_at | string | No | The 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| kind | string (dead-end | decision | hypothesis | open | resume) | Yes | What kind of line this is. |
|---|
| body | string | Yes | One 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.
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
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_contracts
Interface contract changes the team has recorded: API, DB, ENV and MODEL.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_decisions
Architectural decisions and the reasoning behind them, per member.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_lessons
Things that cost the team time and would cost it again.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_plans
Implementation plans other members are working to.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_team_decisions
Team-wide decisions that apply to everyone, distinct from any one member's personal decisions.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_blockers
Who is blocked and what would unblock them. Resolved blockers are not listed.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_ready
Work that is ready to be picked up. Items already taken are not listed.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| cursor | string | No | Continue 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": {}
}
}
scout_get_tickets
Tickets the team is tracking. Closed tickets are not listed.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_prs
Pull requests the team is tracking. Merged or closed ones are not listed.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| cursor | string | No | Continue 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
}
}
}
scout_get_tape
Append-only narration of real state changes: hypotheses, dead ends, decisions, and where to resume.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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
}
}
}
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
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "scout_get_now",
"arguments": {}
}
}
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
| Name | Type | Required | Description |
|---|
| entry_id | string | Yes | The entry id. |
|---|
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "scout_get_entry",
"arguments": {
"entry_id": "0b7e3c52-6f1a-4c1e-9d6e-2f4a8c1b9e01"
}
}
}
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
| Name | Type | Required | Description |
|---|
| teammate | string | No | Handle or member id. Omit for everyone. |
|---|
| since | string | No | ISO timestamp with a timezone offset. Only sessions active since then. Omit for the last 7 days. |
|---|
| limit | integer (≥ 1) | No | Maximum 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
}
}
}
scout_search
Search across every entry this seat may read. Unquoted queries OR their content terms — an absent word lowers rank rather than removing the row — and drop question fluff (why/how/did/we/…). A quoted phrase still requires the phrase. Matches whole words and fragments inside identifiers. Ranked, so it takes no cursor: ranks move as entries are written and a cursor over them would skip and repeat matches. When there are more, it says so — narrow the query or raise the limit.
Read · scout:read
Arguments
| Name | Type | Required | Description |
|---|
| query | string (≤ 512) | Yes | What to search for. |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| entry_type | string | No | Restrict to one type. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "scout_search",
"arguments": {
"query": "refresh token",
"since_days": 30
}
}
}
Hand off and pick up
Leave work for someone else to finish, pick up what was left, and keep a long agent loop resumable.
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
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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_closed | boolean | No | Also 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
}
}
}
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
| Name | Type | Required | Description |
|---|
| loop_id | string | No | One loop. Omit for all. |
|---|
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "scout_get_loops",
"arguments": {}
}
}
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
| Name | Type | Required | Description |
|---|
| body | string | Yes | What you are handing over. |
|---|
| subject | string | No | What 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. |
|---|
| ticket | string | No | The tracker ticket this handoff belongs to, like CAS-123. The handoff ends when the ticket closes. |
|---|
| expires_in | string | No | How 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. |
|---|
| visibility | string (workspace | private) | No | workspace shares it; private keeps it to this member. |
|---|
| retention_class | string (standard | ephemeral | regulated) | No | How long this is kept. |
|---|
| idempotency_key | string | No | Your own key for this write. Replaying the same key returns the original entry instead of writing a second one. |
|---|
| repository | string | No | The 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."
}
}
}
scout_plan_done
Mark one of your plans complete. Records a transition, not an edit.
Write · scout:write
Arguments
| Name | Type | Required | Description |
|---|
| entry_id | string | Yes | The plan's entry id. |
|---|
| note | string | No | Optional 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| entry_id | string | Yes | The handoff's entry id. |
|---|
| note | string | No | Optional 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| entry_id | string | Yes | The closed handoff's entry id. |
|---|
| reason | string | Yes | Why 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| loop_id | string | No | The loop to update. Omit to start a new one. |
|---|
| goal | string | No | What the loop is for. 200 max. |
|---|
| working_on | string | No | What it's on right now. 500 max. |
|---|
| status | string (running | paused | blocked) | No | running, paused or blocked. |
|---|
| client | string | No | The agent running it. Defaults to your connection's. |
|---|
| resume | string | No | Where to pick it back up, in prose. 4,000 max. |
|---|
| visibility | string (workspace | private) | No | workspace (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"
}
}
}
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
| Name | Type | Required | Description |
|---|
| loop_id | string | Yes | The loop. |
|---|
| reason | string | No | Why, 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| loop_id | string | Yes | The loop. |
|---|
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "scout_loop_claim",
"arguments": {
"loop_id": "9c4e1a7b-2d3f-4a5b-8c6d-1e2f3a4b5c6d"
}
}
}
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
| Name | Type | Required | Description |
|---|
| loop_id | string | Yes | The loop. |
|---|
| note | string | No | Optional 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.
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
| Name | Type | Required | Description |
|---|
| member | string | No | Handle or member id. Omit for everyone. |
|---|
| since_days | integer (≥ 1) | No | Only entries from the last N days. Omit for no window. |
|---|
| limit | integer (≥ 1) | No | Maximum entries. |
|---|
| include_stale | boolean | No | Include work-in-progress the workspace considers stale. |
|---|
| cursor | string | No | Continue 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": {}
}
}
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
| Name | Type | Required | Description |
|---|
| name | string | Yes | The deprecated thing. |
|---|
| replacement | string | Yes | What to use instead. |
|---|
| reason | string | Yes | Why, specifically. |
|---|
| visibility | string (workspace | private) | No | workspace shares it; private keeps it to this member. |
|---|
| retention_class | string (standard | ephemeral | regulated) | No | How long this is kept. |
|---|
| idempotency_key | string | No | Your own key for this write. Replaying the same key returns the original entry instead of writing a second one. |
|---|
| repository | string | No | The 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| entry_id | string | Yes | The deprecation's entry id. |
|---|
| replacement | string | Yes | What 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."
}
}
}
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": {}
}
}
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
| Name | Type | Required | Description |
|---|
| keep | string | Yes | The id of the entry that holds. |
|---|
| reason | string | Yes | Why 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| intent | string | Yes | What 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."
}
}
}
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
| Name | Type | Required | Description |
|---|
| branch | string | No | Your 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"
}
}
}