Skip to content

MCP Reference

Complete reference for all 58 tools exposed by the Jig MCP server.

Connect with: jig serve mcp (stdio transport).

Note: Most tools accept an optional project parameter (string) to target a specific project. If omitted, the active session project is used. This parameter is listed where relevant but omitted from simple tools for brevity.

Table of contents

Project setup

Spec authoring

Task management

Criteria

Execution and planning

Context bundles

Snippets

Requests

Intake

Attachments

Decisions

Sharing

Briefing

Utilities


list_projects

List all registered projects with their spec count and health. Shows which project is currently active.

Parameters: none

Example:

list_projects()

Example output:

Projects:
* my-app 4 specs healthy
api-server 2 specs healthy
(* = active project)

switch_project

Set the active project for this session. All subsequent tools operate on the selected project until you switch again.

Parameters:

NameTypeDescription
namestringProject name to switch to

Example:

switch_project({ name: "my-app" })

create_project

Create a new Jig project for a repository. Automatically selects the new project as the active session project.

Parameters:

NameTypeDescription
namestringProject name (typically the repository or codebase name)
descriptionstring (optional)Short description of what this project is for

Example:

create_project({ name: "my-app", description: "Main web application" })

delete_project

Permanently delete a project and all its specs, tasks, and runs. This action cannot be undone.

Parameters:

NameTypeDescription
namestringProject name to delete

Example:

delete_project({ name: "old-prototype" })

list_specs

List all feature specs with status and task counts in a hierarchical tree showing parent/child relationships. Archived specs are hidden by default.

Parameters:

NameTypeDescription
include_archivedboolean (optional)Include archived specs (default false)

Example:

list_specs()
list_specs({ include_archived: true })

Example output:

[in-progress] auth-layer (3/5 tasks)
[new] login-flow (0/2 tasks)
[done] database-client (2/2 tasks)

show_spec

Show a spec’s full markdown content and list of associated tasks with their status.

Parameters:

NameTypeDescription
namestringSpec name

Example:

show_spec({ name: "auth-layer" })

create_spec

Create a new spec from template. Before calling this, run the Spec Placement Protocol: call list_specs first, classify the work, and confirm placement with the user.

Parameters:

NameTypeDescription
namestringSpec name in kebab-case
layer"platform" | "services" | "surface" (optional)Architectural layer
parentstring (optional)Parent spec name for sub-specs

Example:

create_spec({ name: "auth-layer", layer: "platform" })
create_spec({ name: "login-flow", parent: "auth-layer" })

update_spec

Update a spec’s content or metadata. Supports two modes: content replacement (full markdown) and patch mode (individual fields). Cannot combine both modes in a single call.

Parameters:

NameTypeDescription
namestringSpec name
contentstring (optional)Full markdown content (content replacement mode)
bundle_namesstring[] (optional)Context bundle names to reference during decomposition and execution
layer"platform" | "services" | "surface" (optional)Architectural layer (patch mode)
stagestring (optional)Spec stage (patch mode)
parentstring | null (optional)Parent spec name, or null to make top-level (patch mode)
bundlesstring[] (optional)Context bundle names to associate (patch mode, alias for bundle_names)

Example:

update_spec({
name: "auth-layer",
content: "# Feature: auth-layer\n\n## Intent\n\nHandles authentication..."
})
update_spec({ name: "auth-layer", layer: "platform", stage: "in-progress" })

reparent_spec

Move a spec under a different parent or make it top-level. Pass null as new_parent to promote to top-level. Prevents circular references.

Parameters:

NameTypeDescription
namestringSpec name to reparent
new_parentstring | nullNew parent spec name, or null for top-level

Example:

reparent_spec({ name: "login-flow", new_parent: "user-auth" })
reparent_spec({ name: "login-flow", new_parent: null })

archive_spec

Archive a spec, hiding it from default list_specs and show_status views. The spec still exists and can be found with include_archived.

Parameters:

NameTypeDescription
namestringSpec name to archive

Example:

archive_spec({ name: "old-feature" })

delete_spec

Hard-delete a spec and all its tasks. Refuses if the spec has sub-specs (delete children first).

Parameters:

NameTypeDescription
namestringSpec name to delete

Example:

delete_spec({ name: "old-feature" })

list_tasks

List all tasks for a spec with IDs, objectives, and status.

Parameters:

NameTypeDescription
specstringSpec name

Example:

list_tasks({ spec: "auth-layer" })

Example output:

[passed] setup-auth-client: Create the Supabase auth client singleton
[in-progress] implement-token-refresh: Add silent token refresh middleware
[new] add-session-guard: Protect routes with session check

show_task

Show a task’s full YAML content including objective, intent, file scope, verification gates, dependencies, and status. Supports both spec+task and handle-based lookup.

Parameters:

NameTypeDescription
specstring (optional)Spec name (not needed if using handle)
taskstring (optional)Task name or handle (e.g., kex-42)
handlestring (optional)Task handle — alternative to spec+task

Example:

show_task({ spec: "auth-layer", task: "setup-auth-client" })
show_task({ handle: "kex-42" })

create_task

Create a new task for a spec. Every task must have objective, file_scope, and at least one behavioral verification command. For tasks involving migrations or deployments, include structured criteria with environment: "production".

Parameters:

NameTypeDescription
specstringSpec name
taskstringTask name in kebab-case
fieldsobjectTask fields (see below)

fields object:

FieldTypeDescription
objectivestringOne-sentence goal
intentstring (optional)Why this task exists: current state, reasoning, expected impact
contextstring (optional)Architectural background
acceptance_criteriaarray (optional)Plain strings or structured SAP criteria with subject/property/expected/method
file_scopestring[] (optional)Files this task creates or modifies (1-5 files)
verificationarray (optional)Commands that prove completion — each has command and proves
guardrailsstring[] (optional)What NOT to do
complexity"simple" | "moderate" | "complex" (optional)Task complexity
dependenciesstring[] (optional)Task names that must complete first

Example:

create_task({
spec: "auth-layer",
task: "setup-auth-client",
fields: {
objective: "Create the Supabase auth client singleton",
intent: "Components currently init Supabase inline. Centralizing removes duplication.",
file_scope: ["src/auth/client.ts", "src/components/Login.tsx"],
verification: [
{ command: "bun run typecheck", proves: "No TypeScript errors" },
{ command: "bun test src/auth", proves: "Auth client works correctly" }
],
guardrails: ["Do not change Supabase project URL or anon key"],
complexity: "simple"
}
})

update_task

Update task fields such as status, objective, or verification gates. Always include completion_notes when marking a task as passed or failed. Blocked status requires blocked_reason. Supports handle-based lookup.

Parameters:

NameTypeDescription
specstring (optional)Spec name (not needed if using handle)
taskstring (optional)Task name or handle (e.g., kex-42)
handlestring (optional)Task handle — alternative to spec+task
fieldsobjectFields to update (key-value pairs)

Example:

update_task({
spec: "auth-layer",
task: "setup-auth-client",
fields: {
status: "passed",
completion_notes: "Created src/auth/client.ts singleton. Updated Login.tsx and Profile.tsx."
}
})
update_task({
handle: "kex-42",
fields: { status: "blocked", blocked_reason: "Waiting on database migration" }
})

delete_task

Hard-delete a task from a spec. Tasks that depended on this one have their dependency removed (with a warning).

Parameters:

NameTypeDescription
specstringSpec name
taskstringTask name to delete

Example:

delete_task({ spec: "auth-layer", task: "setup-auth-client" })

move_task

Move a task from one spec to another, preserving all content.

Parameters:

NameTypeDescription
specstringCurrent spec name
taskstringTask name to move
target_specstringTarget spec name

Example:

move_task({ spec: "auth-layer", task: "setup-auth-client", target_spec: "database-client" })

verify_task

Run a task’s verification gates as a third-party check. Executes each verification command and automatically passes or fails the task based on the results. Supports handle-based lookup.

Parameters:

NameTypeDescription
specstring (optional)Spec name (not needed if using handle)
taskstring (optional)Task name or handle
handlestring (optional)Task handle — alternative to spec+task

Example:

verify_task({ spec: "auth-layer", task: "setup-auth-client" })
verify_task({ handle: "kex-42" })

Example output:

Verification PASSED (2/2)
Verified by: mcp
o bun run typecheck
o bun test src/auth

add_criterion

Add a structured acceptance criterion to a task with an auto-generated verification method. Uses the SAP (Structured Acceptance Protocol) format.

Parameters:

NameTypeDescription
taskstringTask name
subjectstringWhat to check (file path, URL, command, DB table)
propertyenum"contains_string", "not_contains", "file_exists", "http_status", "column_exists", "output_matches", "count_gte", "schema_matches"
expectedstringExpected value or pattern
descriptionstringHuman-readable description of the criterion

Example:

add_criterion({
task: "setup-auth-client",
subject: "src/auth/client.ts",
property: "file_exists",
expected: "true",
description: "Auth client module exists"
})

list_criteria

List a task’s acceptance criteria with subjects, properties, and verification methods.

Parameters:

NameTypeDescription
taskstringTask name

Example:

list_criteria({ task: "setup-auth-client" })

remove_criterion

Remove a criterion from a task. The criterion is soft-deleted and preserved in history.

Parameters:

NameTypeDescription
criterion_idstringThe criterion UUID to remove

Example:

remove_criterion({ criterion_id: "abc123-def456" })

list_runs

List execution runs for a spec, showing result status and duration.

Parameters:

NameTypeDescription
specstringSpec name

Example:

list_runs({ spec: "auth-layer" })

Example output:

[passed] run-001 setup-auth-client 12.3s
[failed] run-002 implement-token-refresh 8.1s

show_run

Show a run’s full output including task output, verification results, and result status.

Parameters:

NameTypeDescription
specstringSpec name
run_idstringRun ID

Example:

show_run({ spec: "auth-layer", run_id: "run-001" })

decompose

Return structured spec content (intent, criteria, constraints, bundles, existing tasks) for task decomposition. Create tasks from the result via create_task.

Parameters:

NameTypeDescription
specstringSpec name

Example:

decompose({ spec: "auth-layer" })

Note: In conversational workflows with Claude, prefer decomposing in-conversation with create_task calls rather than using this tool. The decompose tool is intended for CLI and headless use.


next_tasks

Return dependency-ready tasks ordered by wave, unlock power, and priority. Use parallel to get N conflict-free tasks safe for simultaneous execution. Use request_id to filter tasks linked to a specific request.

Parameters:

NameTypeDescription
specstring (optional)Filter by spec
countnumber (optional)Max tasks to return (default 10)
parallelnumber (optional)Return N conflict-free tasks safe to run in parallel (checks file_scope overlaps)
request_idstring (optional)Filter tasks to only those linked to a specific request

Example:

next_tasks()
next_tasks({ spec: "auth-layer", count: 3 })
next_tasks({ parallel: 4 })
next_tasks({ request_id: "req-abc123" })

plan_parallel

Compute optimal parallel execution batches respecting dependencies and file scope overlap. Shows all waves of tasks that can be executed simultaneously.

Parameters:

NameTypeDescription
specstring (optional)Limit plan to a specific spec

Example:

plan_parallel()
plan_parallel({ spec: "auth-layer" })

show_status

Show project status overview, or drill into a specific spec to see individual task progress.

Parameters:

NameTypeDescription
specstring (optional)Spec name for detail view

Example:

show_status()
show_status({ spec: "auth-layer" })

show_tree

Return the full project skeleton: specs with sub-specs and tasks, all with status indicators. Hierarchical view for understanding project structure at a glance.

Parameters:

NameTypeDescription
specstring (optional)Show tree for a single spec and its children

Example:

show_tree()
show_tree({ spec: "auth-layer" })

Example output:

auth-layer [in-progress]
login-flow [new]
setup-oauth-redirect [new]
handle-callback [new]
setup-auth-client [passed]
implement-token-refresh [in-progress]

list_bundles

List available context bundles. Filter with flags to control shared/project-only visibility.

Parameters:

NameTypeDescription
include_sharedboolean (optional)Include shared bundles from other projects (default false)
shared_onlyboolean (optional)Show only shared bundles (cross-project)
project_onlyboolean (optional)Show only project bundles, exclude shared

Example:

list_bundles()
list_bundles({ include_shared: true })
list_bundles({ shared_only: true })

show_bundle

Show a context bundle’s full content including files, constraints, patterns, and shared status.

Parameters:

NameTypeDescription
namestringBundle name

Example:

show_bundle({ name: "api-client-patterns" })

create_bundle

Create a new reusable context bundle for sharing files, constraints, and patterns across specs. Use update_bundle to add content after creating.

Parameters:

NameTypeDescription
namestringBundle name (kebab-case)
descriptionstring (optional)Bundle description
is_sharedboolean (optional)Make bundle available across all projects (default false)

Example:

create_bundle({ name: "api-client-patterns" })
create_bundle({ name: "shared-conventions", description: "Cross-project coding standards", is_shared: true })

update_bundle

Update a bundle’s files, constraints, patterns, description, or shared status. Pass only the fields you want to change.

Parameters:

NameTypeDescription
namestringBundle name
fieldsobjectFields to update (see below)

fields object:

FieldTypeDescription
descriptionstring (optional)New bundle description
filesarray (optional)Files included: each has path and optional reason
constraintsstring[] (optional)Implementation constraints
patternsarray (optional)Code patterns: each has name and optional description
is_sharedboolean (optional)Make bundle available across all projects

Example:

update_bundle({
name: "api-client-patterns",
fields: {
files: [
{ path: "src/api/client.ts", reason: "Base HTTP client" },
{ path: "src/api/types.ts", reason: "Shared API types" }
],
constraints: ["All API calls must go through the client singleton"],
patterns: [{ name: "retry-with-backoff", description: "Exponential backoff on 5xx" }]
}
})

delete_bundle

Delete a context bundle permanently. Only deletes bundles owned by the current project.

Parameters:

NameTypeDescription
namestringBundle name

Example:

delete_bundle({ name: "old-patterns" })

list_snippets

List available text snippets. Use include_shared to see cross-project snippets.

Parameters:

NameTypeDescription
include_sharedboolean (optional)Include shared snippets from other projects (default false)

Example:

list_snippets()
list_snippets({ include_shared: true })

show_snippet

Show a snippet’s full text content.

Parameters:

NameTypeDescription
namestringSnippet name

Example:

show_snippet({ name: "auth-setup-steps" })

create_snippet

Create a named reusable text snippet. Use is_shared for cross-project availability.

Parameters:

NameTypeDescription
namestringSnippet name (kebab-case)
contentstringThe text content of the snippet
is_sharedboolean (optional)Make snippet available across all projects (default false)

Example:

create_snippet({
name: "auth-setup-steps",
content: "1. Create Supabase client\n2. Configure auth providers\n3. Add session middleware"
})

delete_snippet

Delete a snippet permanently. Only affects snippets owned by the current project.

Parameters:

NameTypeDescription
namestringSnippet name

Example:

delete_snippet({ name: "old-snippet" })

create_request

Create a request to track work originating from conversations, bugs, ideas, or internal needs. Requests capture intent before any spec or task exists.

Parameters:

NameTypeDescription
titlestringShort title summarizing the request
descriptionstring (optional)Detailed description of the request
originenum (optional)"conversation", "bug", "idea", "user-report", "internal" (default: "internal")
priorityenum (optional)"critical", "high", "normal", "low" (default: "normal")

Example:

create_request({
title: "Add focus mode for single-phrase editing",
description: "Users want to isolate a single phrase for focused editing without distraction from other content.",
origin: "user-report",
priority: "high"
})

list_requests

List requests with optional status and priority filters. Ordered by most recent.

Parameters:

NameTypeDescription
statusenum (optional)"open", "in-progress", "resolved", "abandoned", "deferred"
priorityenum (optional)"critical", "high", "normal", "low"

Example:

list_requests()
list_requests({ status: "open", priority: "high" })

show_request

Show a request’s full details including linked tasks, findings, and specs.

Parameters:

NameTypeDescription
request_idstringRequest UUID

Example:

show_request({ request_id: "abc123-def456" })

Link a task, finding, or spec to a request. Tasks use spec_name/task_name format for the link target.

Parameters:

NameTypeDescription
request_idstringRequest UUID to link to
link_typeenum"task", "finding", "spec"
link_targetstringTarget identifier: spec_name/task_name for tasks, finding ID for findings, spec name for specs

Example:

link_to_request({
request_id: "abc123-def456",
link_type: "spec",
link_target: "focus-mode"
})
link_to_request({
request_id: "abc123-def456",
link_type: "task",
link_target: "focus-mode/setup-focus-state"
})

resolve_request

Resolve a request with an outcome and a required learning. Records the resolution timestamp.

Parameters:

NameTypeDescription
request_idstringRequest UUID to resolve
outcomeenum"resolved", "partial", "deferred", "wont-fix", "cant-reproduce"
learningstringWhat was learned from this request (required)
outcome_notesstring (optional)Additional notes about the resolution

Example:

resolve_request({
request_id: "abc123-def456",
outcome: "resolved",
learning: "Focus mode requires isolating the phrase panel from the canvas scroll context."
})

search_requests

Search requests by title or description text. Returns matches ordered by most recent.

Parameters:

NameTypeDescription
querystringSearch text to match against request titles and descriptions

Example:

search_requests({ query: "focus mode" })

file_bug

File a bug report into the intake pile. AI triage runs in the background to match it to the most relevant spec.

Parameters:

NameTypeDescription
contentstringDescription of the bug
contextstring (optional)Additional context from the conversation

Example:

file_bug({
content: "Login button does nothing when clicked on mobile Safari",
context: "User reported this in their iOS 17 session, using Safari 17"
})

Example output:

{
"id": "bug-3a9f",
"type": "bug",
"status": "new",
"content": "Login button does nothing when clicked on mobile Safari",
"created_at": "2026-03-03T14:22:00Z"
}

file_idea

File a feature idea into the intake pile. AI triage runs in the background to match it to the most relevant spec.

Parameters:

NameTypeDescription
contentstringDescription of the idea
contextstring (optional)Additional context from the conversation

Example:

file_idea({
content: "Let users pin their most-used specs to the top of the list"
})

list_findings

List findings from the intake pile. Shows bugs and ideas with triage status, suggested spec, and severity. Defaults to non-dismissed, newest first.

Parameters:

NameTypeDescription
pile_type"bug" | "idea" (optional)Filter by type
status"new" | "triaged" | "planned" | "dismissed" (optional)Filter by status
limitnumber (optional)Max results (default 20)

Example:

list_findings()
list_findings({ pile_type: "bug", limit: 5 })

dismiss_finding

Dismiss a finding so it no longer appears in default listings.

Parameters:

NameTypeDescription
finding_idstringID of the finding to dismiss

Example:

dismiss_finding({ finding_id: "bug-3a9f" })

add_attachment

Attach text content (logs, snippets, notes) to a task, spec, finding, or project.

Parameters:

NameTypeDescription
parent_typeenum"task", "spec", "finding", "project"
parent_idstringParent entity ID (task name, spec name, etc.)
namestringAttachment name (e.g., error-log, screenshot-1)
contentstring (optional)Inline text content (for snippets, logs, etc.)
attachment_typestring (optional)Type: snippet, log, image, file (default: snippet)
mime_typestring (optional)MIME type (default: text/plain)

Example:

add_attachment({
parent_type: "task",
parent_id: "setup-auth-client",
name: "error-log",
content: "TypeError: Cannot read property 'session' of undefined\n at AuthClient.init (client.ts:42)",
attachment_type: "log"
})

list_attachments

List attachments for a task, spec, finding, or project.

Parameters:

NameTypeDescription
parent_typeenum"task", "spec", "finding", "project"
parent_idstringParent entity ID

Example:

list_attachments({ parent_type: "task", parent_id: "setup-auth-client" })

Example output:

Attachments for task "setup-auth-client":
- error-log [log] (0.2KB) | Preview: TypeError: Cannot read property...
- design-notes [snippet] (1.4KB) | Preview: The auth client should...

record_decision

Record a decision on a task with decision text and rationale. Sets the task status to passed.

Parameters:

NameTypeDescription
specstringSpec name
taskstringTask name
decision_textstringWhat was decided
rationalestringWhy this decision was made (required)

Example:

record_decision({
spec: "auth-layer",
task: "choose-auth-provider",
decision_text: "Use Supabase Auth with PKCE flow",
rationale: "Supabase is already our database provider, PKCE is more secure for SPAs than implicit flow, and it simplifies the deployment since we avoid a separate auth service."
})

list_decisions

List all recorded decisions across the project with rationale and context.

Parameters: none (uses active project)

Example:

list_decisions()

share_spec

Create a shareable public URL for a spec.

Parameters:

NameTypeDescription
spec_namestringName of the spec to share

Example:

share_spec({ spec_name: "auth-layer" })

unshare_spec

Revoke a shared spec link by its share token.

Parameters:

NameTypeDescription
share_tokenstringThe share token to revoke

Example:

unshare_spec({ share_token: "abc123def456" })

list_shares

List active shared spec links for the current project.

Parameters: none (uses active project)

Example:

list_shares()

get_briefing

Get a daily briefing summarizing the project state: decisions needed, human tasks ready, stale blocked tasks, code-ready tasks, and blocked count.

Parameters: none (uses active project)

Example:

get_briefing()

Full-text search across spec content, task content, and findings. Returns ranked results with matched snippets.

Parameters:

NameTypeDescription
querystringSearch query
filter"specs_only" | "tasks_only" | "findings_only" (optional)Limit search to a type

Example:

search({ query: "token refresh" })
search({ query: "Safari mobile", filter: "findings_only" })

workflow_guide

Get the complete Jig workflow guide as a refresher. Covers the full development lifecycle, file structure, task format, and best practices.

Parameters: none

Example:

workflow_guide()