-
Notifications
You must be signed in to change notification settings - Fork 0
Async Jobs
github-actions[bot] edited this page Mar 18, 2026
·
11 revisions
Long-running MATLAB code is automatically handled through the async job system.
- You call
execute_codewith your MATLAB code - The server starts executing synchronously in a background task
- If execution exceeds
sync_timeout(default 30 seconds), the job is promoted to async - You get back a
job_idimmediately - Poll
get_job_statusfor progress updates - Call
get_job_resultwhen the job completes
PENDING → RUNNING → COMPLETED
→ FAILED
→ CANCELLED
- PENDING: Job created but not yet started
- RUNNING: Engine acquired and code is executing
- COMPLETED: Execution finished successfully with a result
- FAILED: Execution encountered an error
-
CANCELLED: Job was cancelled via
cancel_job
When your code completes within sync_timeout (default 30 seconds):
{
"status": "completed",
"job_id": "j-...",
"text": "output here",
"error": null
}When your code exceeds sync_timeout:
- The job is automatically promoted to background execution
- An engine is held until completion
- You receive a pending response immediately:
{
"status": "pending",
"job_id": "j-..."
}- Poll
get_job_statusto monitor progress and retrieve the result
Use the mcp_progress() helper function in your MATLAB code to report progress back to the agent:
mcp_progress(__mcp_job_id__, percentage, message)-
__mcp_job_id__— automatically injected into the workspace by the server -
percentage— number from 0 to 100 -
message— optional status message
n = 1e6;
results = zeros(n, 1);
for i = 1:n
results(i) = process_item(i);
if mod(i, 1e5) == 0
mcp_progress(__mcp_job_id__, i/n*100, ...
sprintf('Processed %d/%d items', i, n));
end
end
disp(mean(results));The agent sees:
get_job_status → {status: "running", progress: 10, message: "Processed 100000/1000000 items"}
get_job_status → {status: "running", progress: 50, message: "Processed 500000/1000000 items"}
get_job_status → {status: "running", progress: 100, message: "Processed 1000000/1000000 items"}
get_job_result → {status: "completed", text: "0.5023"}
-
mcp_progress.mwrites a JSON file to__mcp_temp_dir__/<job_id>.progress -
get_job_statusreads this file and includes progress in the response - The file is cleaned up when the job completes or is pruned
| Tool | Description |
|---|---|
get_job_status |
Current status, progress percentage, and elapsed time |
get_job_result |
Full result of a completed job (or error details for failed jobs) |
cancel_job |
Cancel a pending or running job |
list_jobs |
List all jobs in the session |
The server automatically injects job context into the MATLAB workspace:
-
__mcp_job_id__— unique identifier for the current job -
__mcp_temp_dir__— temporary directory for progress files and outputs -
__mcp_session_id__— session identifier
These variables are available throughout your MATLAB code execution.
When a job fails, get_job_result returns detailed error information:
{
"status": "failed",
"job_id": "j-...",
"error": {
"type": "MATLABError",
"message": "Undefined function or variable 'x'",
"matlab_id": "MATLAB:undefinedVarOrFunction",
"stack_trace": "Error in code (line 5)\n result = x + 1;"
}
}execution:
sync_timeout: 30 # Seconds before async promotion
max_execution_time: 86400 # Hard limit (24h)
sessions:
job_retention_seconds: 86400 # Keep job metadata for 24h after completion- Completed, failed, and cancelled jobs are retained for
job_retention_seconds(default 24 hours) - The server periodically prunes expired jobs to manage memory
- Job metadata is removed, but results are available until pruning occurs
- Active jobs (PENDING or RUNNING) are never pruned while executing
Jobs automatically track elapsed time from start to completion:
-
elapsed_secondsavailable in job metadata - Useful for monitoring long-running operations
- Reported in job status responses
- Short code (< 30s): Results return inline, no polling needed
-
Medium code (30s - minutes): Auto-promoted, poll with
get_job_statusfor progress -
Long code (hours): Add
mcp_progress()calls so the agent can report status to users -
Cancel long jobs: Call
cancel_jobif you need to stop a running job immediately -
Increase timeout: Set
sync_timeout: 60if most of your code takes 30-60s to reduce async overhead -
Check active jobs: Use
list_jobsto see all pending/running jobs for a session before starting new work