Replace internal task tracking (TODO.md, FINDINGS.md) with four structured documentation files covering architecture, tool reference, development guide, and project history. Trim CLAUDE.md to agent instructions only — all detailed content now lives in docs/. - docs/architecture.md: subsystem plugin model, transports, IDE bridge, AI facade, full package layout - docs/tools.md: all 49 MCP tools with parameters and descriptions - docs/development.md: prerequisites, test patterns, adding tools/subsystems - docs/history.md: split history, 5 phases with commit hashes, known issues Co-Authored-By: Virgil <virgil@lethean.io>
44 KiB
go-ai MCP Tool Reference
Module: forge.lthn.ai/core/go-ai
This document is the authoritative reference for every MCP tool exposed by the go-ai hub. It is generated from the source definitions in mcp/ and mcp/ide/.
Overview
go-ai exposes 49 tools across 13 functional groups via the Model Context Protocol. The server can be started in two modes:
- Stdio (default):
core mcp serve— standard MCP transport for use with Claude, Cursor, and other MCP clients. - TCP:
MCP_ADDR=:9000 core mcp serve— listens on a TCP socket for programmatic access.
Registration model
Tools are registered in two tiers:
-
Built-in tools (registered unconditionally in
mcp.New()): file operations, directory operations, language detection, RAG, metrics, and webview tools. These are always present regardless of configuration. -
Subsystem tools (registered via
WithSubsystem()): ML, process management, WebSocket, and IDE tools. These require the corresponding backend service to be provided via anOptionat construction time. Process and WebSocket tools are silently omitted if their respective services are not supplied. IDE tools are provided by theide.Subsystemsubsystem.
Workspace sandboxing
All file and directory tools operate within a sandboxed filesystem medium. By default the sandbox root is the current working directory at the time mcp.New() is called. The root can be changed with WithWorkspaceRoot(path). All paths supplied to file tools are validated to remain within this root — path traversal attempts are rejected.
Audit logging
Every tool execution is logged. Tools that perform writes, process control, or browser automation are logged at Security level. Read-only tools are logged at Info level.
Tool Groups
| Group | Tools | File |
|---|---|---|
| File Operations | 6 | mcp/mcp.go |
| Directory Operations | 2 | mcp/mcp.go |
| Language Detection | 2 | mcp/mcp.go |
| RAG — Vector Search | 3 | mcp/tools_rag.go |
| ML — Inference & Scoring | 5 | mcp/tools_ml.go |
| Metrics | 2 | mcp/tools_metrics.go |
| Process Management | 6 | mcp/tools_process.go |
| WebSocket | 2 | mcp/tools_ws.go |
| Browser Automation | 10 | mcp/tools_webview.go |
| IDE Chat | 5 | mcp/ide/tools_chat.go |
| IDE Build | 3 | mcp/ide/tools_build.go |
| IDE Dashboard | 3 | mcp/ide/tools_dashboard.go |
File Operations
Six tools for reading, writing, editing, renaming, deleting, and checking files. All paths are resolved relative to the configured workspace root and must not escape it.
file_read
Read the contents of a file.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | Path to the file, relative to workspace root |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Content | string |
content |
Full file contents |
| Language | string |
language |
Detected language ID (see lang_detect) |
| Path | string |
path |
Echoed input path |
Notes
The language field is populated by extension-based detection and will be "plaintext" for unrecognised extensions. The call fails if the path does not exist or points outside the workspace root.
file_write
Write content to a file, creating it and any intermediate directories if they do not exist.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | Destination path, relative to workspace root |
| Content | string |
content |
Yes | Content to write |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the write succeeded |
| Path | string |
path |
Echoed input path |
Notes
Overwrites any existing file at the given path without warning. Parent directories are created automatically. Logged at Security level.
file_edit
Edit a file by replacing one occurrence (or all occurrences) of old_string with new_string. The file must already exist.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | Path to the file |
| OldString | string |
old_string |
Yes | Exact string to find; must not be empty |
| NewString | string |
new_string |
Yes | Replacement string (may be empty to delete) |
| ReplaceAll | bool |
replace_all |
No | Replace every occurrence; default is first only |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Path | string |
path |
Echoed input path |
| Success | bool |
success |
Whether the edit succeeded |
| Replacements | int |
replacements |
Number of occurrences replaced |
Notes
Returns an error if old_string is empty or is not found in the file. With replace_all=false (default) only the first occurrence is replaced and replacements will be 1. With replace_all=true all occurrences are replaced and replacements reflects the total count.
file_delete
Delete a file or empty directory.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | Path to delete |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the deletion succeeded |
| Path | string |
path |
Echoed input path |
Notes
Non-empty directories are not deleted; use multiple calls or a process tool to remove them recursively. Logged at Security level.
file_rename
Rename or move a file within the workspace.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| OldPath | string |
oldPath |
Yes | Current path |
| NewPath | string |
newPath |
Yes | Destination path |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the rename succeeded |
| OldPath | string |
oldPath |
Echoed source path |
| NewPath | string |
newPath |
Echoed destination path |
Notes
Both paths must remain within the workspace root. Can be used to move files between subdirectories. Logged at Security level.
file_exists
Check whether a path exists and whether it is a file or directory.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | Path to check |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Exists | bool |
exists |
Whether the path exists |
| IsDir | bool |
isDir |
Whether the path is a directory |
| Path | string |
path |
Echoed input path |
Notes
Returns exists=false for paths that do not exist or are inaccessible. Does not distinguish between a missing path and a permission error.
Directory Operations
Two tools for listing and creating directories within the workspace.
dir_list
List the contents of a directory.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | Directory path, relative to workspace root |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Entries | []DirectoryEntry |
entries |
List of entries |
| Path | string |
path |
Echoed input path |
DirectoryEntry fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Name | string |
name |
Entry name (filename only) |
| Path | string |
path |
Entry path (joined with input path) |
| IsDir | bool |
isDir |
Whether the entry is a directory |
| Size | int64 |
size |
File size in bytes; 0 for directories |
Notes
Lists only the immediate children; not recursive. The path field in each entry preserves the relative form of the input path.
dir_create
Create a new directory, including any necessary parent directories.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | Directory path to create |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the directory was created |
| Path | string |
path |
Echoed input path |
Notes
Behaves like mkdir -p; does not fail if the directory already exists.
Language Detection
Two tools for working with the built-in language registry.
lang_detect
Detect the programming language of a file based on its extension or name.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | File path (the file need not exist; only the name is inspected) |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Language | string |
language |
Detected language ID |
| Path | string |
path |
Echoed input path |
Notes
Detection is purely extension-based. Dockerfile (exact name, no extension) is detected as "dockerfile". Unknown extensions return "plaintext".
lang_list
Get the list of all supported programming languages.
Parameters
None.
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Languages | []LanguageInfo |
languages |
All supported language entries |
LanguageInfo fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Language identifier used throughout the API |
| Name | string |
name |
Human-readable display name |
| Extensions | []string |
extensions |
File extensions that map to this language |
Supported languages
typescript, javascript, go, python, rust, java, php, ruby, html, css, json, yaml, markdown, sql, shell
The full detection set (including c, cpp, csharp, scss, xml, swift, kotlin, dockerfile) is available via lang_detect but is not enumerated by lang_list.
RAG — Vector Search
Three tools for semantic document retrieval and ingestion. These tools require:
- Qdrant running at
localhost:6334(default gRPC port) - Ollama running at
localhost:11434for embedding generation
The default collection name is hostuk-docs.
rag_query
Query the RAG vector database for relevant documentation. Returns semantically similar content based on the query.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Question | string |
question |
Yes | The natural-language query |
| Collection | string |
collection |
No | Collection name; default hostuk-docs |
| TopK | int |
topK |
No | Number of results to return; default 5 |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Results | []RAGQueryResult |
results |
Ordered list of matching chunks |
| Query | string |
query |
Echoed question |
| Collection | string |
collection |
Collection used |
| Context | string |
context |
Pre-formatted context string suitable for injection into a prompt |
RAGQueryResult fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Content | string |
content |
The chunk text |
| Source | string |
source |
Original source file or URL |
| Section | string |
section |
Section heading within the source (if available) |
| Category | string |
category |
Category tag (if available) |
| ChunkIndex | int |
chunkIndex |
Chunk position within the source document |
| Score | float32 |
score |
Cosine similarity score |
Notes
Returns an error if question is empty. Results are ordered by descending similarity score. The context field is ready for direct use in a system prompt.
rag_ingest
Ingest documents into the RAG vector database. Supports both single files and entire directories.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Path | string |
path |
Yes | File or directory path to ingest |
| Collection | string |
collection |
No | Target collection; default hostuk-docs |
| Recreate | bool |
recreate |
No | Drop and recreate the collection before ingestion |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether ingestion succeeded |
| Path | string |
path |
Echoed input path |
| Collection | string |
collection |
Collection used |
| Chunks | int |
chunks |
Number of chunks indexed (file only; 0 for directory) |
| Message | string |
message |
Human-readable summary |
Notes
The path is validated against the workspace medium (sandboxed). For directory ingestion the chunk count is not returned. Setting recreate=true destroys all existing vectors in the collection before ingesting. Logged at Security level.
rag_collections
List all available collections in the Qdrant vector database.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ShowStats | bool |
show_stats |
No | Include point count and status for each collection |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Collections | []CollectionInfo |
collections |
List of collections |
CollectionInfo fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Name | string |
name |
Collection name |
| PointsCount | uint64 |
points_count |
Total vectors stored (only present when show_stats=true) |
| Status | string |
status |
Qdrant collection status (only present when show_stats=true) |
Notes
Opens a short-lived Qdrant client connection per call. Stats are fetched per-collection and failures for individual collections are logged and skipped rather than aborting the entire response.
ML — Inference & Scoring
Five tools for text generation, response scoring, capability probing, pipeline status, and backend enumeration. These tools are provided by the MLSubsystem and require a configured go-ml service instance (ml.Service).
The generation path is: go-ai → go-ml.Service.Generate → InferenceAdapter → inference.TextModel (from go-inference).
ml_generate
Generate text via a configured ML inference backend.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Prompt | string |
prompt |
Yes | The input prompt |
| Backend | string |
backend |
No | Backend name; uses service default if omitted |
| Model | string |
model |
No | Model override for backends that support multiple models |
| Temperature | float64 |
temperature |
No | Sampling temperature |
| MaxTokens | int |
max_tokens |
No | Maximum tokens to generate |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Response | string |
response |
Generated text |
| Backend | string |
backend |
Backend used |
| Model | string |
model |
Model used (if applicable) |
Notes
Returns an error if prompt is empty. Backend selection falls through to the service default when backend is not specified. Available backends can be queried with ml_backends.
ml_score
Score a prompt/response pair using one or more scoring suites.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Prompt | string |
prompt |
Yes | The original prompt |
| Response | string |
response |
Yes | The model response to evaluate |
| Suites | string |
suites |
No | Comma-separated suite names; default heuristic |
Available suites: heuristic, semantic
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Heuristic | *ml.HeuristicScores |
heuristic |
Length, structure, and format heuristics (present when requested) |
| Semantic | *ml.SemanticScores |
semantic |
LLM judge scores (present when requested) |
| Content | *ml.ContentScores |
content |
Content scores (not available via this tool; use ml_probe) |
Notes
heuristic scoring requires no backend. semantic scoring requires a judge backend to be configured in the ML service; the call returns an error if none is present. The content suite is not supported by this tool — use ml_probe instead. Both prompt and response must be non-empty.
ml_probe
Run capability probes against an inference backend. Each probe sends a structured prompt to the backend and records the response.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Backend | string |
backend |
No | Backend name; uses service default if omitted |
| Categories | string |
categories |
No | Comma-separated category names to filter probes; all categories run if omitted |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Total | int |
total |
Number of probes executed |
| Results | []MLProbeResultItem |
results |
Per-probe results |
MLProbeResultItem fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Probe identifier |
| Category | string |
category |
Probe category |
| Response | string |
response |
Backend response, or an error string prefixed with "error: " |
Notes
Probes are drawn from ml.CapabilityProbes defined in go-ml. Individual probe failures are captured as error strings in the response rather than aborting the entire run. Temperature is fixed at 0.7 and MaxTokens at 2048 for all probes.
ml_status
Show training and generation progress from InfluxDB.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| InfluxURL | string |
influx_url |
No | InfluxDB URL; default http://localhost:8086 |
| InfluxDB | string |
influx_db |
No | Database name; default lem |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Status | string |
status |
Formatted status report as a multi-line string |
Notes
Connects to InfluxDB on each call. Returns an error if the InfluxDB instance is unreachable.
ml_backends
List available inference backends and their status.
Parameters
None.
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Backends | []MLBackendInfo |
backends |
All registered backends |
| Default | string |
default |
Name of the default backend |
MLBackendInfo fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Name | string |
name |
Backend identifier |
| Available | bool |
available |
Whether the backend is currently available |
Notes
Queries the go-inference global registry directly, bypassing go-ml.Service. This is the canonical source of truth for which backends are compiled in and available at runtime.
Metrics
Two tools for recording and querying agent activity events. Events are stored in daily JSONL files on the local filesystem via the go-ai/ai package.
metrics_record
Record a metrics event for AI or security tracking.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Type | string |
type |
Yes | Event type identifier |
| AgentID | string |
agent_id |
No | Agent identifier |
| Repo | string |
repo |
No | Repository name associated with the event |
| Data | map[string]any |
data |
No | Arbitrary additional event data |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the event was recorded |
| Timestamp | time.Time |
timestamp |
Server-assigned event timestamp |
Notes
The timestamp is assigned by the server at the moment of recording; any timestamp in data is treated as user data only. Returns an error if type is empty.
metrics_query
Query metrics events and get aggregated statistics by type, repository, and agent.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Since | string |
since |
No | Lookback window; default 7d |
Supported duration formats: Nd (days), Nh (hours), Nm (minutes). Examples: "7d", "24h", "30m".
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Total | int |
total |
Total events in window |
| ByType | []MetricCount |
by_type |
Event counts grouped by type |
| ByRepo | []MetricCount |
by_repo |
Event counts grouped by repository |
| ByAgent | []MetricCount |
by_agent |
Event counts grouped by agent ID |
| Events | []MetricEventBrief |
events |
The 10 most recent events, newest first |
MetricCount fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Key | string |
key |
Group key (type name, repo name, or agent ID) |
| Count | int |
count |
Number of events in this group |
MetricEventBrief fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Type | string |
type |
Event type |
| Timestamp | time.Time |
timestamp |
Event timestamp |
| AgentID | string |
agent_id |
Agent identifier (if set) |
| Repo | string |
repo |
Repository name (if set) |
Notes
Returns an error if the since value cannot be parsed. The duration unit must be a single character: d, h, or m. Durations must be positive integers.
Process Management
Six tools for starting, stopping, and interacting with external processes. These tools are only registered when a process.Service instance is provided via WithProcessService() at construction time.
All process-control operations (process_start, process_stop, process_kill, process_input) are logged at Security level.
process_start
Start a new external process. Returns a process ID for tracking.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Command | string |
command |
Yes | The executable to run |
| Args | []string |
args |
No | Command-line arguments |
| Dir | string |
dir |
No | Working directory for the process |
| Env | []string |
env |
No | Additional environment variables in KEY=VALUE format |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Unique process identifier used in subsequent calls |
| PID | int |
pid |
Operating system process ID |
| Command | string |
command |
Echoed command |
| Args | []string |
args |
Echoed arguments |
| StartedAt | time.Time |
startedAt |
Process start time |
Notes
Returns an error if command is empty. The process is managed by the process.Service; its output is captured and available via process_output.
process_stop
Gracefully stop a running process by ID.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ID | string |
id |
Yes | Process ID returned by process_start |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Echoed process ID |
| Success | bool |
success |
Whether the stop signal was sent |
| Message | string |
message |
Status message |
Notes
The current implementation sends SIGKILL. A SIGTERM-first approach may be introduced in a future version. If the process does not respond, use process_kill.
process_kill
Force kill a process by ID.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ID | string |
id |
Yes | Process ID returned by process_start |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Echoed process ID |
| Success | bool |
success |
Whether the kill succeeded |
| Message | string |
message |
Status message |
Notes
Sends an unconditional kill signal via process.Service.Kill(). Use when process_stop does not succeed within an acceptable time.
process_list
List all managed processes.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| RunningOnly | bool |
running_only |
No | Return only actively running processes; default false |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Processes | []ProcessInfo |
processes |
List of process records |
| Total | int |
total |
Number of records returned |
ProcessInfo fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Process identifier |
| Command | string |
command |
Executable name |
| Args | []string |
args |
Arguments |
| Dir | string |
dir |
Working directory |
| Status | string |
status |
Process status string |
| PID | int |
pid |
OS process ID |
| ExitCode | int |
exitCode |
Exit code (meaningful only after termination) |
| StartedAt | time.Time |
startedAt |
Process start time |
| Duration | time.Duration |
duration |
Elapsed or total runtime |
process_output
Get the captured stdout/stderr output of a process by ID.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ID | string |
id |
Yes | Process ID |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Echoed process ID |
| Output | string |
output |
Captured output as a single string |
Notes
Output is buffered by process.Service. For streaming output in real time, connect a WebSocket subscriber via ws_start and subscribe to the process channel.
process_input
Send text to the stdin of a running process.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| ID | string |
id |
Yes | Process ID |
| Input | string |
input |
Yes | Text to write to stdin |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Echoed process ID |
| Success | bool |
success |
Whether the input was delivered |
| Message | string |
message |
Status message |
Notes
Returns an error if the process is not found or if input is empty. Does not append a newline automatically; include "\n" in input if required.
WebSocket
Two tools for starting and inspecting the WebSocket hub used for real-time process output streaming. These tools are only registered when a ws.Hub instance is provided via WithWSHub() at construction time.
The WebSocket endpoint is served at /ws on the configured address.
ws_start
Start the WebSocket server for real-time process output streaming.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Addr | string |
addr |
No | Listen address in host:port format; default ":8080" |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the server started (or was already running) |
| Addr | string |
addr |
Actual address the server is bound to |
| Message | string |
message |
Status message including the full WebSocket URL |
Notes
If the server is already running, returns the existing address without error. The WebSocket URL takes the form ws://<addr>/ws. Logged at Security level because it opens a network listener.
ws_info
Get WebSocket hub statistics.
Parameters
None.
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Clients | int |
clients |
Number of currently connected WebSocket clients |
| Channels | int |
channels |
Number of active subscription channels |
Browser Automation
Ten tools for controlling a Chrome browser via the Chrome DevTools Protocol (CDP). All browser tools share a single global webview.Webview instance; webview_connect must be called before any other browser tool in a session.
Prerequisite: start Chrome with remote debugging enabled:
google-chrome --remote-debugging-port=9222
webview_connect, webview_eval, and webview_navigate are logged at Security level due to their capability to exfiltrate data or execute arbitrary code.
webview_connect
Connect to a running Chrome instance via the Chrome DevTools Protocol.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| DebugURL | string |
debug_url |
Yes | Chrome DevTools URL, e.g. http://localhost:9222 |
| Timeout | int |
timeout |
No | Default operation timeout in seconds; default 30 |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the connection was established |
| Message | string |
message |
Status message |
Notes
Closes any existing connection before establishing a new one. Returns an error if debug_url is empty or if Chrome is not reachable at the given address.
webview_disconnect
Disconnect from Chrome DevTools and release the connection.
Parameters
None.
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the disconnection succeeded |
| Message | string |
message |
Status message |
Notes
Returns success=true with message "No active connection" if no connection was open. Safe to call multiple times.
webview_navigate
Navigate the browser to a URL.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| URL | string |
url |
Yes | Fully qualified URL to navigate to |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether navigation was initiated |
| URL | string |
url |
Echoed URL |
Notes
Returns an error if not connected. Navigation is initiated but this tool does not wait for the page to finish loading; use webview_wait to synchronise on a page element after navigation.
webview_click
Click on an element identified by a CSS selector.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Selector | string |
selector |
Yes | CSS selector for the target element |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the click was performed |
Notes
Returns an error if not connected or if selector is empty. The selector must match at least one element; the first match is clicked.
webview_type
Type text into an element identified by a CSS selector.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Selector | string |
selector |
Yes | CSS selector for the target element |
| Text | string |
text |
Yes | Text to type into the element |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the text was typed |
Notes
Returns an error if not connected or if selector is empty. Appends to any existing content in the element rather than replacing it; clear the field first if a fresh value is required.
webview_query
Query DOM elements by CSS selector.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Selector | string |
selector |
Yes | CSS selector |
| All | bool |
all |
No | Return all matching elements; default returns first match only |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Found | bool |
found |
Whether any elements matched |
| Count | int |
count |
Number of elements matched |
| Elements | []WebviewElementInfo |
elements |
Element details |
WebviewElementInfo fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| NodeID | int |
nodeId |
CDP node identifier |
| TagName | string |
tagName |
HTML tag name |
| Attributes | map[string]string |
attributes |
Element attributes |
| BoundingBox | *webview.BoundingBox |
boundingBox |
Element position and dimensions |
Notes
With all=false (default), returns at most one element and found=false when no match exists. With all=true, returns all matches. A zero-result all=true query returns found=false and an empty slice rather than an error.
webview_console
Get browser console messages captured since the last call.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Clear | bool |
clear |
No | Clear the console buffer after reading; default false |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Messages | []WebviewConsoleMessage |
messages |
Captured console messages |
| Count | int |
count |
Number of messages |
WebviewConsoleMessage fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Type | string |
type |
Message level: log, warn, error, etc. |
| Text | string |
text |
Message content |
| Timestamp | string |
timestamp |
RFC 3339 timestamp |
| URL | string |
url |
Source URL (if available) |
| Line | int |
line |
Source line number (if available) |
Notes
Returns an error if not connected. Messages accumulate in a buffer; use clear=true to reset the buffer after reading to avoid receiving duplicate messages on subsequent calls.
webview_eval
Evaluate a JavaScript expression in the browser context.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Script | string |
script |
Yes | JavaScript expression or statement to evaluate |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether evaluation succeeded |
| Result | any |
result |
Return value of the expression (JSON-serialisable) |
| Error | string |
error |
Error message if evaluation failed |
Notes
Returns an error if not connected or if script is empty. JavaScript errors are captured in the error field with success=false rather than being returned as tool-level errors. Logged at Security level.
webview_screenshot
Capture a screenshot of the current browser viewport.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Format | string |
format |
No | Image format: "png" or "jpeg"; default "png" |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the screenshot was captured |
| Data | string |
data |
Base64-encoded image data |
| Format | string |
format |
Format used |
Notes
Returns an error if not connected. The data field is standard base64 (not URL-safe); decode with standard base64 to obtain the raw image bytes.
webview_wait
Wait for an element matching a CSS selector to appear in the DOM.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Selector | string |
selector |
Yes | CSS selector to wait for |
| Timeout | int |
timeout |
No | Maximum wait time in seconds |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Success | bool |
success |
Whether the element appeared within the timeout |
| Message | string |
message |
Status message including the matched selector |
Notes
Returns an error if not connected or if selector is empty. If the element does not appear before the timeout, an error is returned. The default timeout is inherited from the connection timeout set during webview_connect.
IDE Chat
Five tools for interacting with agent chat sessions via the Laravel WebSocket bridge. These tools are provided by the ide.Subsystem and require a ws.Hub instance for real-time forwarding.
Implementation status: The Laravel backend integration is currently a stub. Tool calls emit bridge messages and return placeholder responses. Live data is delivered asynchronously via WebSocket subscriptions.
ide_chat_send
Send a message to an agent chat session.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| SessionID | string |
sessionId |
Yes | Target session identifier |
| Message | string |
message |
Yes | Message content to send |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Sent | bool |
sent |
Whether the message was forwarded to the bridge |
| SessionID | string |
sessionId |
Echoed session ID |
| Timestamp | time.Time |
timestamp |
Server-assigned send timestamp |
Notes
The bridge forwards the message on the chat:<sessionId> channel. The agent's reply arrives asynchronously via the WebSocket connection. Returns an error if the bridge is not available.
ide_chat_history
Retrieve message history for a chat session.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| SessionID | string |
sessionId |
Yes | Session identifier |
| Limit | int |
limit |
No | Maximum number of messages to return |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| SessionID | string |
sessionId |
Echoed session ID |
| Messages | []ChatMessage |
messages |
Message list (currently empty; data arrives via WebSocket) |
ChatMessage fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Role | string |
role |
"user" or "assistant" |
| Content | string |
content |
Message text |
| Timestamp | time.Time |
timestamp |
Message timestamp |
Notes
Currently returns an empty messages array. The history request is forwarded to the Laravel backend via the bridge; data is returned asynchronously.
ide_session_list
List active agent sessions.
Parameters
None.
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Sessions | []Session |
sessions |
Active sessions (currently empty; data arrives via WebSocket) |
Session fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Session identifier |
| Name | string |
name |
Human-readable session name |
| Status | string |
status |
Session status string |
| CreatedAt | time.Time |
createdAt |
Session creation time |
ide_session_create
Create a new agent session.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Name | string |
name |
Yes | Human-readable name for the new session |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Session | Session |
session |
The new session record |
Notes
Currently returns a placeholder session with status="creating" and no id. The actual session is created asynchronously by the Laravel backend; the final record arrives via WebSocket.
ide_plan_status
Get the current plan status for an agent session.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| SessionID | string |
sessionId |
Yes | Session identifier |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| SessionID | string |
sessionId |
Echoed session ID |
| Status | string |
status |
Plan status; currently "unknown" |
| Steps | []PlanStep |
steps |
Plan steps (currently empty) |
PlanStep fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Name | string |
name |
Step name |
| Status | string |
status |
Step status |
IDE Build
Three tools for querying CI build status and logs. Provided by ide.Subsystem; data is sourced from the Laravel backend via the WebSocket bridge.
Implementation status: Stub. Tool calls emit bridge messages and return placeholder responses.
ide_build_status
Get the status of a specific build.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| BuildID | string |
buildId |
Yes | Build identifier |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Build | BuildInfo |
build |
Build record |
BuildInfo fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| ID | string |
id |
Build identifier |
| Repo | string |
repo |
Repository name |
| Branch | string |
branch |
Git branch |
| Status | string |
status |
Build status; currently "unknown" |
| Duration | string |
duration |
Build duration (if complete) |
| StartedAt | time.Time |
startedAt |
Build start time |
ide_build_list
List recent builds, optionally filtered by repository.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Repo | string |
repo |
No | Filter by repository name |
| Limit | int |
limit |
No | Maximum number of builds to return |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Builds | []BuildInfo |
builds |
Build records (currently empty) |
ide_build_logs
Retrieve log output for a build.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| BuildID | string |
buildId |
Yes | Build identifier |
| Tail | int |
tail |
No | Return only the last N lines |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| BuildID | string |
buildId |
Echoed build identifier |
| Lines | []string |
lines |
Log lines (currently empty) |
IDE Dashboard
Three tools for querying platform-wide overview, activity, and aggregate metrics. Provided by ide.Subsystem; data is sourced from the Laravel backend via the WebSocket bridge.
Implementation status: ide_dashboard_overview returns live bridge connectivity status. The other two tools are stubs that forward requests and return placeholder responses.
ide_dashboard_overview
Get a high-level overview of the platform.
Parameters
None.
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Overview | DashboardOverview |
overview |
Platform summary |
DashboardOverview fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Repos | int |
repos |
Number of repositories (stub; currently 0) |
| Services | int |
services |
Number of services (stub; currently 0) |
| ActiveSessions | int |
activeSessions |
Active agent sessions (stub; currently 0) |
| RecentBuilds | int |
recentBuilds |
Recent build count (stub; currently 0) |
| BridgeOnline | bool |
bridgeOnline |
Whether the Laravel WebSocket bridge is currently connected |
Notes
BridgeOnline is the only live field. All other fields return 0 until the Laravel backend integration is complete.
ide_dashboard_activity
Get the recent activity feed.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Limit | int |
limit |
No | Maximum number of events to return |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Events | []ActivityEvent |
events |
Activity events (currently empty) |
ActivityEvent fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| Type | string |
type |
Event category |
| Message | string |
message |
Human-readable description |
| Timestamp | time.Time |
timestamp |
Event timestamp |
ide_dashboard_metrics
Get aggregate build and agent metrics for a time period.
Parameters
| Field | Type | JSON key | Required | Description |
|---|---|---|---|---|
| Period | string |
period |
No | Time period: "1h", "24h", or "7d"; default "24h" |
Response
| Field | Type | JSON key | Description |
|---|---|---|---|
| Period | string |
period |
Echoed period |
| Metrics | DashboardMetrics |
metrics |
Aggregate metrics |
DashboardMetrics fields
| Field | Type | JSON key | Description |
|---|---|---|---|
| BuildsTotal | int |
buildsTotal |
Total builds in period |
| BuildsSuccess | int |
buildsSuccess |
Successful builds |
| BuildsFailed | int |
buildsFailed |
Failed builds |
| AvgBuildTime | string |
avgBuildTime |
Average build duration |
| AgentSessions | int |
agentSessions |
Agent sessions created |
| MessagesTotal | int |
messagesTotal |
Total chat messages |
| SuccessRate | float64 |
successRate |
Build success ratio (0.0–1.0) |
Notes
All fields currently return zero values. Data will be populated once the Laravel backend integration is complete.