Skip to main content
Glama
Jungle-Grid

jungle-grid-mcp-server

Official
by Jungle-Grid

Jungle Grid MCP Server

Jungle Grid MCP lets MCP-aware agents estimate, submit, monitor, cancel, and retrieve artifacts from Jungle Grid workloads. It supports local stdio clients and hosted Streamable HTTP deployments that forward tool calls to the Jungle Grid API.

Use it for asynchronous AI workload execution, batch processing, training, fine-tuning, uploaded file or script backed jobs, lifecycle diagnostics, workload logs, and managed output artifacts.

Installation

Requirements:

  • Node.js 18 or newer

  • A Jungle Grid API key for local stdio, or an OAuth bearer token for hosted HTTP

  • API scopes that match the tools you want to call

Run the local stdio server with npx:

JUNGLE_GRID_API_KEY=jg_placeholder npx -y @jungle-grid/mcp

Install globally if you prefer a stable executable:

npm install -g @jungle-grid/mcp
junglegrid-mcp

Related MCP server: clausius

Configuration

Local stdio uses environment variables:

Variable

Required

Purpose

JUNGLE_GRID_API_KEY

Yes for local stdio

Bearer token forwarded to the Jungle Grid API.

JUNGLEGRID_API_BASE

No

API base URL. Defaults to https://api.junglegrid.dev.

JUNGLE_GRID_API_URL

No

Legacy API base URL alias, also accepted.

Hosted HTTP gateway deployments also support:

Variable

Required

Purpose

MCP_TRANSPORT=http

No

Starts Streamable HTTP instead of stdio.

PORT

No

HTTP port. Defaults to 3000.

JUNGLEGRID_INTERNAL_SERVICE_TOKEN

No

Service token used for OAuth introspection or fallback API calls.

OAUTH_ISSUER

No

OAuth issuer. Defaults to https://api.junglegrid.dev.

MCP_RESOURCE

No

Protected resource URL. Defaults to https://mcp.junglegrid.dev.

MCP_RESOURCE_METADATA_URL

No

OAuth protected-resource metadata URL.

OPENAI_APPS_CHALLENGE_TOKEN

No

Enables /.well-known/openai-apps-challenge when configured.

Never commit API keys, OAuth tokens, signed upload URLs, signed artifact URLs, or callback secrets.

Connection Modes

Local stdio

Local clients launch the package and communicate over stdio.

{
  "mcpServers": {
    "junglegrid": {
      "command": "npx",
      "args": ["-y", "@jungle-grid/mcp"],
      "env": {
        "JUNGLE_GRID_API_KEY": "jg_placeholder"
      }
    }
  }
}

Claude Desktop

Add the same mcpServers block to claude_desktop_config.json, then fully quit and reopen Claude Desktop.

macOS:

~/Library/Application Support/Claude/claude_desktop_config.json

Windows:

%APPDATA%\Claude\claude_desktop_config.json

Cursor

For project config, avoid checked-in secrets. Put the key in the environment used to launch Cursor:

{
  "mcpServers": {
    "junglegrid": {
      "command": "npx",
      "args": ["-y", "@jungle-grid/mcp"]
    }
  }
}

For a local uncommitted Cursor config:

{
  "mcpServers": {
    "junglegrid": {
      "command": "npx",
      "args": ["-y", "@jungle-grid/mcp"],
      "env": {
        "JUNGLE_GRID_API_KEY": "jg_placeholder",
        "JUNGLEGRID_API_BASE": "https://api.junglegrid.dev"
      }
    }
  }
}

Hosted HTTP

The HTTP server exposes:

  • GET /healthz

  • GET /.well-known/oauth-protected-resource

  • POST /mcp

Start it locally:

MCP_TRANSPORT=http PORT=3000 JUNGLEGRID_INTERNAL_SERVICE_TOKEN=service_token_placeholder npm start

Hosted MCP clients must send Authorization: Bearer <oauth_access_token> to POST /mcp. The server introspects tokens at /oauth/introspect on the configured API base and requires tool-specific scopes.

Minimal Working Example

Ask your MCP client to call the tools in this order:

{
  "tool": "estimate_job",
  "arguments": {
    "workload_type": "batch",
    "image": "python:3.11-slim",
    "command": ["python", "-c", "print('hello from Jungle Grid')"],
    "routing_mode": "balanced"
  }
}

If the estimate is acceptable, submit the job:

{
  "tool": "submit_job",
  "arguments": {
    "name": "mcp-hello",
    "workload_type": "batch",
    "image": "python:3.11-slim",
    "command": ["python", "-c", "print('hello from Jungle Grid')"],
    "expected_artifacts": ["/workspace/artifacts/output.txt"]
  }
}

Use the returned job_id with get_job, get_job_events, get_job_logs, list_artifacts, and get_artifact.

MCP Tools

The current tool registry exposes these exact tool names:

Tool

Purpose

Required parameters

Optional parameters

estimate_job

Estimate routing, capacity source, and expected cost without creating work.

workload_type

model_size, image, command, args, routing_mode, template, notes

submit_job

Submit a workload. This may start compute and incur usage charges.

name, workload_type, image

model_size, command, args, env, input_files, script_files, script_file, expected_artifacts, routing_mode, template, metadata

upload_job_input

Create a signed upload slot for an input file or script.

filename

content_type, kind

list_job_inputs

List uploaded inputs and scripts for the authenticated account.

none

none

list_jobs

List recent jobs.

none

limit, cursor, status

get_job

Read job status, phase, scheduling, billing, and artifact readiness.

job_id

none

get_job_events

Read lifecycle events for scheduling, provisioning, startup, failures, and cancellation.

job_id

none

get_job_logs

Read persisted runtime and workload logs.

job_id

limit, cursor

cancel_job

Request cancellation of a non-terminal job.

job_id

reason

list_artifacts

List managed output artifacts for a job.

job_id

none

get_artifact

Create temporary artifact download information.

job_id, artifact_id

none

Accepted workload_type values are inference, training, fine_tuning, and batch. The MCP server forwards fine_tuning to the REST API as fine-tuning. Accepted routing_mode values are cost, speed, and balanced.

Tool Details

estimate_job

Returns classification, route status, capacity source, estimated cost range, availability, and screening details when returned by the API. An estimate is not a reservation and does not guarantee immediate startup.

Common errors: missing workload_type, invalid enum value, authentication failure, forbidden scope, invalid request, upstream API error.

{
  "workload_type": "inference",
  "model_size": 7,
  "image": "pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime",
  "command": ["python", "infer.py"],
  "routing_mode": "balanced",
  "notes": "single model inference run"
}

submit_job

Creates an asynchronous job. model_size is an optional size in GB used to select suitable GPU capacity and is forwarded as REST model_size_gb. command is preferably an array of strings. env must be an object with string values and is forwarded as REST environment. input_files and script_files accept arrays of { "input_id": "..." }; string IDs are normalized for compatibility. The current REST implementation supports one uploaded script reference.

Expected response includes job_id, status, queued_at or submitted_at, routing fields, input/script details, and artifact contract fields when returned by the API.

Common errors: missing name, image, or workload_type; invalid workload type; command or args too long; invalid environment values; missing or incomplete input IDs; insufficient funds; unavailable capacity; maintenance; authentication or scope failures.

{
  "name": "transcribe-audio",
  "workload_type": "inference",
  "model_size": 7,
  "image": "python:3.11-slim",
  "command": ["python", "/workspace/scripts/transcribe.py", "/workspace/inputs/audio.ogg", "/workspace/artifacts/transcript.txt"],
  "script_files": [{ "input_id": "inp_script123" }],
  "input_files": [{ "input_id": "inp_audio123" }],
  "expected_artifacts": ["/workspace/artifacts/transcript.txt"],
  "routing_mode": "balanced",
  "metadata": {
    "request_id": "req_123"
  }
}

upload_job_input

Creates a signed upload slot. It does not upload file bytes by itself. Upload the bytes to upload.upload_url using upload.method, then complete the upload with upload.complete_url and the returned upload.token.

kind is an arbitrary string accepted by the API. Use input for normal input files and script for scripts by convention. Script uploads mount under /workspace/scripts/<filename>; input uploads mount under /workspace/inputs/<filename>.

Expected response:

{
  "upload": {
    "input_id": "inp_123",
    "filename": "transcribe.py",
    "method": "PUT",
    "upload_url": "https://signed-upload.example",
    "token": "upload_token",
    "expires_at": "2026-06-11T12:15:00Z",
    "complete_url": "https://api.junglegrid.dev/v1/job-inputs/inp_123/complete"
  }
}

Common errors: missing filename, invalid filename, file too large, upload storage unavailable, authentication or scope failure.

list_job_inputs

Returns uploaded inputs with input_id, filename, content_type, size_bytes, kind, status, ready, mount_path, and timestamps when available.

list_jobs

Returns jobs, limit, next_cursor, and has_more. limit is capped by the API. status is a free-form filter string passed to the API; do not assume the MCP schema restricts it to a fixed enum.

get_job

Returns the current job status and details. Status, execution phase, lifecycle events, runtime details, and workload logs are separate surfaces.

Important response fields include status, phase, execution_phase, status_message, status_reason, phase_started_at, phase_last_updated_at, wait_duration_seconds, delayed_start, delay_reason, scheduling, startup_diagnostics, provider, artifacts_ready, failure, input_files, script_file, and artifact_contract when present.

get_job_events

Returns lifecycle events before and during execution. Events may exist before workload logs begin. Events include IDs, types, phases, titles, messages, source, level, timestamps, sequence, and a generated timestamp.

Use events to diagnose queueing, route selection, scheduling, provider provisioning, input preparation, startup, retries, failures, and cancellation.

get_job_logs

Returns stored log entries with items, next_cursor, has_more, failure_highlight, and usage_hint when available. Entries include entry_id, source, category, stream, message, truncated, and created_at when returned by the API.

Logs can be empty while a job is queued, scheduling, provisioning, or preparing. Call get_job_events when logs are empty but the job is not terminal. This MCP tool fetches persisted logs; it does not provide true streaming.

cancel_job

Requests cancellation for a pending, queued, assigned, starting, or running job. Completed, failed, rejected, or already cancelled jobs return a conflict from the API.

Expected response includes job_id, status, and status_reason when returned by the API. Cancellation may trigger managed teardown, but do not assume immediate infrastructure shutdown.

list_artifacts

Returns managed artifacts for a job. Artifacts include artifact_id, job_id, filename, content_type, size_bytes, status, ready, and timestamps when returned by the API. Failed jobs may have no artifacts or partial artifacts.

get_artifact

Creates temporary download information for one artifact. The API returns artifact metadata, a signed URL, and expires_at. Treat the URL as a secret.

Common errors: artifact not found, artifact not ready, artifact storage unavailable, forbidden job, authentication failure.

Production Workflows

Simple Job

  1. Estimate:

{
  "workload_type": "batch",
  "image": "python:3.11-slim",
  "command": ["python", "-c", "from pathlib import Path; Path('/workspace/artifacts/output.txt').write_text('done')"],
  "routing_mode": "balanced"
}
  1. Submit:

{
  "name": "simple-artifact-job",
  "workload_type": "batch",
  "image": "python:3.11-slim",
  "command": ["python", "-c", "from pathlib import Path; Path('/workspace/artifacts/output.txt').write_text('done')"],
  "expected_artifacts": ["/workspace/artifacts/output.txt"],
  "routing_mode": "balanced"
}
  1. Monitor:

{ "job_id": "job_123" }

Call get_job, get_job_events, and get_job_logs with the same job_id until the status is terminal.

  1. Retrieve:

{ "job_id": "job_123" }

Call list_artifacts, then:

{
  "job_id": "job_123",
  "artifact_id": "art_123"
}

File-Backed Job

  1. Create upload slots:

{
  "filename": "transcribe.py",
  "content_type": "text/x-python",
  "kind": "script"
}
{
  "filename": "audio.ogg",
  "content_type": "audio/ogg",
  "kind": "input"
}
  1. Upload each file to the returned signed upload_url, then complete it:

curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: text/x-python" \
  --data-binary @transcribe.py

curl -X POST "$COMPLETE_URL" \
  -H "Authorization: Bearer $JUNGLE_GRID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "upload_token",
    "filename": "transcribe.py",
    "content_type": "text/x-python",
    "size_bytes": 1234,
    "etag": "optional-etag"
  }'
  1. Submit with input IDs:

{
  "name": "file-backed-transcription",
  "workload_type": "inference",
  "image": "python:3.11-slim",
  "command": ["python", "/workspace/scripts/transcribe.py", "/workspace/inputs/audio.ogg", "/workspace/artifacts/transcript.txt"],
  "script_files": [{ "input_id": "inp_script123" }],
  "input_files": [{ "input_id": "inp_audio123" }],
  "expected_artifacts": ["/workspace/artifacts/transcript.txt"]
}
  1. Monitor with get_job_events, get_job, and get_job_logs.

  2. Retrieve /workspace/artifacts/transcript.txt with list_artifacts and get_artifact.

Error Shape

REST MCP routes return an envelope:

{
  "ok": false,
  "error": {
    "code": "INVALID_REQUEST",
    "message": "name, image, and workload_type are required"
  }
}

The MCP server converts API errors into tool errors like:

submit_job failed: INVALID_REQUEST: name, image, and workload_type are required

Common API codes include UNAUTHORIZED, FORBIDDEN, INVALID_REQUEST, JOB_INPUT_NOT_FOUND, JOB_INPUT_NOT_READY, ARTIFACT_NOT_READY, NOT_FOUND, CONFLICT, INSUFFICIENT_FUNDS, MAINTENANCE_ACTIVE, and INTERNAL_ERROR.

Security

  • Keep API keys and OAuth tokens out of prompts, source control, browser bundles, logs, and issue trackers.

  • Prefer host secret stores or local-only MCP config files for JUNGLE_GRID_API_KEY.

  • Treat signed upload and artifact URLs as temporary bearer secrets.

  • Do not print environment variables that contain tokens from workload code.

  • Review submit_job and cancel_job requests before allowing an agent to execute them, because they can spend credits or stop active work.

Development

npm install
npm run build
npm test

Run stdio from the built package:

JUNGLE_GRID_API_KEY=jg_placeholder node dist/index.js

Run HTTP locally:

MCP_TRANSPORT=http PORT=3000 JUNGLEGRID_INTERNAL_SERVICE_TOKEN=service_token_placeholder node dist/index.js

Inspect with MCP Inspector:

JUNGLE_GRID_API_KEY=jg_placeholder npx @modelcontextprotocol/inspector node dist/index.js

Full Documentation

Public Jungle Grid documentation: https://junglegrid.dev/docs

MCP documentation page: https://junglegrid.dev/docs/mcp

License

MIT

Available Tools

8 tools
cancel_jobA
Destructive

Cancel an existing Jungle Grid job. This may stop active execution and prevent further outputs.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes
reasonNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false; the description goes further by stating the concrete behavioral effects: stopping active execution and preventing further outputs. This adds context not captured by the annotations and is consistent with them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, the action is front-loaded, and every word adds meaning. No unnecessary detail or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation with an output schema, the core purpose and behavior are covered. However, the meaning of the reason parameter is missing, and there is no guidance on edge cases like cancelling an already-completed job. This leaves a moderate gap for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the description does not explain either parameter. jobId is only implied by 'existing job,' and the optional reason parameter is entirely unexplained. Agents must infer parameter meaning without support.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Cancel an existing Jungle Grid job,' which clearly distinguishes it from sibling tools like submit_job, get_job, and list_jobs. It also adds the functional effect of stopping active execution and preventing further outputs, leaving no ambiguity about the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it applies to an existing job and may affect active execution. It does not explicitly name alternatives or when-not conditions, but no sibling tool offers cancellation, so the context is sufficient for an agent to select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

estimate_jobA
Read-only

Estimate routing, capacity source, and expected cost for a proposed Jungle Grid workload without submitting it.

ParametersJSON Schema
NameRequiredDescriptionDefault
workloadYes
model_sizeNoOptional model size in GB.
imageNo
commandNo
argsNo
routing_modeNo
templateNo
notesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description need not reiterate safety. It adds value by specifying what the estimate covers (routing, capacity, cost). No contradictions with annotations. However, it omits details like rate limits or state effects, but these are less critical for a read-only estimate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence with no filler. It front-loads the key action and resource, making it easy to process. Every word contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters (1 required) and an output schema, the description covers the tool's purpose but lacks parameter guidance. The complexity is moderate, and while the output schema reduces the need to explain return values, the missing parameter semantics leave the description incomplete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 13% (only model_size described). The tool description does not elaborate on how parameters like workload, routing_mode, image, command, etc., affect the estimate. With low coverage, the description should compensate but fails to add meaningful parameter context, leaving parameters ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Estimate'), the resource ('Jungle Grid workload'), and the specific aspects estimated ('routing, capacity source, expected cost'). It also distinguishes itself from submission tools by noting 'without submitting it', making the purpose very specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool (before submission) versus the sibling 'submit_job'. However, it does not explicitly exclude cases like checking existing jobs or provide alternative contexts. While clear for its primary use case, additional guidance on when not to use it would improve this dimension.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_artifactA
Read-only

Retrieve download information for a specific output artifact from a Jungle Grid job.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes
artifactIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is known. The description adds the distinction that this provides download information rather than artifact content, but it reveals little else about behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, direct sentence that front-loads the action and resource. There is no filler or redundant repetition of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with an output schema, the description adequately covers the core purpose. It falls short only in not explicitly guiding the agent toward when to prefer list_artifacts, but this is a minor gap given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden of explaining parameters. It only loosely maps 'job' and 'specific artifact' to jobId and artifactId, but adds no format, constraints, or additional meaning for either parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Retrieve download information') and a specific resource ('a specific output artifact from a Jungle Grid job'). It clearly differs from siblings like list_artifacts and get_job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: when download information for a particular artifact is needed. However, it does not explicitly contrast with alternatives such as list_artifacts or mention any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_jobA
Read-only

Retrieve current status and execution details for a specific Jungle Grid job belonging to the authenticated user.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds 'belonging to the authenticated user' (auth constraint) and specifies 'status and execution details' as return content. No contradiction, but marginal additional value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence with clear verb-object structure, no filler, directly conveys essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values are documented externally. Description covers purpose and auth constraint. Annotations provide safety profile. Complete for a simple read operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the single parameter jobId is self-explanatory given its name and the tool's purpose. The description does not add extra detail about jobId format or constraints, but baseline 3 is appropriate for a simple, clear parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the verb 'Retrieve' and the resource 'specific Jungle Grid job', distinguishing it from siblings like list_jobs (list all) and cancel_job (cancel). It also adds scope 'belonging to the authenticated user'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for retrieving a specific job's status/details, but lacks explicit guidance on when to use vs alternatives (e.g., when to use get_job vs get_job_logs or list_jobs). No when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_logsB
Read-only

Retrieve execution logs for a specific Jungle Grid job belonging to the authenticated user.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes
limitNo
cursorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and non-destructive. The description adds the user-scoping constraint, which is valuable behavioral context. However, it does not disclose pagination behavior (despite the 'cursor' parameter), potential rate limits, or the fact that logs may be truncated. With annotations covering safety, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, perfectly scoped sentence that conveys the core action and resource. No extraneous information. Ideal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has three parameters (one required) and an output schema exists, the description should cover parameter semantics and usage context. It fails on parameter explanation and provides no usage guidelines. The output schema likely covers return structure, but the description's gaps make the tool incomplete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. Only 'jobId' is implicitly clear from the resource name. The optional parameters 'limit' and 'cursor' are not mentioned, leaving their semantics entirely unspecified. This is a significant gap that hampers correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Retrieve' and the resource 'execution logs for a specific Jungle Grid job'. It adds a key constraint ('belonging to the authenticated user') that helps distinguish from potential admin-only tools. However, it does not explicitly differentiate from sibling tools like 'get_job' or 'get_artifact', preventing a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as 'list_jobs' or 'get_job'. There is no mention of prerequisites, context, or any exclusion criteria, leaving the agent to infer usage solely from the tool name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_artifactsA
Read-only

List output artifacts associated with a specific Jungle Grid job.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds job-scoped output artifact context, but does not disclose additional behavioral details such as pagination, ordering, or empty-result behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. The core action and scope are front-loaded, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one parameter, an output schema, and safety annotations, the description is largely sufficient. It could be more complete by pointing to get_artifact for retrieving a single artifact, but that is optional rather than essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It maps jobId to 'a specific Jungle Grid job,' which provides the core semantic, but it does not give format details, examples, or how to obtain the job ID.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'List output artifacts associated with a specific Jungle Grid job.' This clearly identifies the operation and distinguishes it from sibling tools like list_job_inputs (inputs) and get_artifact (single artifact).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'associated with a specific Jungle Grid job' provides clear context for when to use the tool: when you need output artifacts for a known job. It does not explicitly name alternatives or exclusions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_jobsA
Read-only

List the authenticated user's Jungle Grid jobs, optionally filtered by status. Use this to find recent jobs before checking status, logs, or artifacts.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool readOnly and non-destructive, so the safety profile is covered. The description adds useful scope information ('authenticated user's jobs') and implies recency ordering, but it does not go into pagination or response behavior. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, with the core action front-loaded and the usage guidance second. Every sentence earns its place and there is no filler or repetition of schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description conveys the tool's purpose, user scope, optional filtering, and its place in the job workflow. With an output schema available, return structure does not need to be spelled out. It only lacks explicit pagination semantics and accepted status values, which are conventional gaps rather than deal-breakers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for parameter meaning. It only addresses 'status' as a filter and leaves 'limit' and 'cursor' entirely unexplained, with no status value details. This is inadequate for a tool with three undocumented optional parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a clearly bounded resource ('the authenticated user's Jungle Grid jobs'), and an optional filter ('by status'). It is readily distinguishable from sibling tools like get_job, which targets a single job, and list_artifacts/list_job_inputs, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly guides when to use it: 'Use this to find recent jobs before checking status, logs, or artifacts.' This gives an agent a clear workflow trigger. It does not name alternatives or state when not to use it, but the contextual cue is strong enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_jobA

Submit a Jungle Grid workload for execution. This may start managed compute infrastructure and incur usage charges.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
workloadYes
imageYes
commandNo
argsNo
envNo
routing_modeNo
templateNo
metadataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate non-read-only and non-destructive. The description adds important behavioral context: starting infrastructure and incurring charges, which goes beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two focused sentences with no redundancy. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema and 9 parameters, the description provides minimal context. It lacks parameter guidance, error handling, or return value details, making it insufficient for a complex submission tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage for 9 parameters. The description does not explain any parameter's meaning or usage, leaving the agent to infer from names alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the action ('Submit') and the resource ('Jungle Grid workload for execution'), clearly distinguishing it from siblings like cancel_job or get_job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description hints at when to use (for submission) and warns about potential charges and infrastructure startup, but does not explicitly compare to alternatives or state when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.9
    • Changedcancel_job5 fields changed
      • addedInput schema / properties / jobId
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / job_id
        Removed value: -{
        -  "description": "The ID of the job to cancel.",
        -  "type": "string"
        -}
      • removedInput schema / properties / reason / description
        Removed value: -"Optional cancellation reason."
      • changedInput schema / required
        Previous value: -[
        -  "job_id"
        -]New value: +[
        +  "jobId"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "cancelled": {
        +          "type": "boolean"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "job_id": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "status": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedestimate_job20 fields changed
      • addedInput schema / properties / args
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / command
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / cost_priority
        Removed value: -{
        -  "enum": [
        -    "low",
        -    "balanced",
        -    "high"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / disk_gb
        Removed value: -{
        -  "description": "Optional managed-provider local disk override in GB. Leave unset to let Jungle Grid auto-size from model_size_gb.",
        -  "type": "number"
        -}
      • removedInput schema / properties / gpu_class
        Removed value: -{
        -  "enum": [
        -    "consumer",
        -    "datacenter"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / gpu_type
        Removed value: -{
        -  "enum": [
        -    "A100",
        -    "A10G",
        -    "H100",
        -    "L4",
        -    "RTX3090",
        -    "RTX4090",
        -    "RTX5090",
        -    "T4"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / image / description
        Removed value: -"Docker image to run."
      • removedInput schema / properties / latency_priority
        Removed value: -{
        -  "enum": [
        -    "low",
        -    "balanced",
        -    "high"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / model_size
        Added value: +{
        +  "description": "Optional model size in GB.",
        +  "type": "number"
        +}
      • removedInput schema / properties / model_size_gb
        Removed value: -{
        -  "description": "Approximate model size in GB — drives tier selection.",
        -  "type": "number"
        -}
      • addedInput schema / properties / notes
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / optimize_for
        Removed value: -{
        -  "enum": [
        -    "balanced",
        -    "cost",
        -    "speed"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / region_mode
        Removed value: -{
        -  "enum": [
        -    "prefer",
        -    "strict"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / region_preference
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / routing_mode
        Added value: +{
        +  "enum": [
        +    "cost",
        +    "speed",
        +    "balanced"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / template
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / workload
        Added value: +{
        +  "enum": [
        +    "inference",
        +    "training",
        +    "fine_tuning",
        +    "batch"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / workload_type
        Removed value: -{
        -  "enum": [
        -    "inference",
        -    "training",
        -    "fine-tuning",
        -    "batch"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "workload_type",
        -  "image"
        -]New value: +[
        +  "workload"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "available": {
        +          "type": "boolean"
        +        },
        +        "can_submit": {
        +          "type": "boolean"
        +        },
        +        "capacity": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "estimate_source": {
        +              "type": "string"
        +            },
        +            "live_candidate_count": {
        +              "type": "number"
        +            },
        +            "live_capacity_available": {
        +              "type": "boolean"
        +            },
        +            "managed_capacity_available": {
        +              "anyOf": [
        +                {
        +                  "type": "boolean"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "managed_profile_count": {
        +              "type": "number"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "classification": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "acceleration_requirement": {
        +              "type": "string"
        +            },
        +            "confidence": {
        +              "type": "string"
        +            },
        +            "reasons": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "requires_gpu": {
        +              "type": "boolean"
        +            },
        +            "workload_type": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "estimated_cost_max_usd": {
        +          "type": "number"
        +        },
        +        "estimated_cost_min_usd": {
        +          "type": "number"
        +        },
        +        "estimated_cost_usd": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "max": {
        +              "type": "number"
        +            },
        +            "min": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "min",
        +            "max"
        +          ],
        +          "type": "object"
        +        },
        +        "likely_gpu_type": {
        +          "type": "string"
        +        },
        +        "routed_gpu_tier": {
        +          "type": "string"
        +        },
        +        "routing": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "route_status": {
        +              "type": "string"
        +            },
        +            "selected_accelerator": {
        +              "type": "string"
        +            },
        +            "selected_route_source": {
        +              "type": "string"
        +            },
        +            "selection_reason": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "screening": {}
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Addedget_artifact
    • Removedget_artifact_download_url
    • Changedget_job4 fields changed
      • addedInput schema / properties / jobId
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / job_id
        Removed value: -{
        -  "description": "The job ID returned by submit_job.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "job_id"
        -]New value: +[
        +  "jobId"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "account_billing": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "lifetime_total_spent_usd": {
        +              "type": "number"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "actual_cost_usd": {
        +          "anyOf": [
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "artifacts_ready": {
        +          "type": "boolean"
        +        },
        +        "estimated_cost_usd": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "max": {
        +              "type": "number"
        +            },
        +            "min": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "min",
        +            "max"
        +          ],
        +          "type": "object"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "job_id": {
        +          "type": "string"
        +        },
        +        "last_status_update": {
        +          "type": "string"
        +        },
        +        "phase": {
        +          "type": "string"
        +        },
        +        "status": {
        +          "type": "string"
        +        },
        +        "status_message": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_job_logs6 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / jobId
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / job_id
        Removed value: -{
        -  "description": "The job ID to fetch logs for.",
        -  "type": "string"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "type": "number"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "job_id"
        -]New value: +[
        +  "jobId"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "items": {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "level": {
        +                "type": "string"
        +              },
        +              "message": {
        +                "type": "string"
        +              },
        +              "timestamp": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "job_id": {
        +          "type": "string"
        +        },
        +        "logs": {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "level": {
        +                "type": "string"
        +              },
        +              "message": {
        +                "type": "string"
        +              },
        +              "timestamp": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "message"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "next_cursor": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Addedlist_artifacts
    • Removedlist_job_artifacts
    • Changedlist_jobs6 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / limit / default
        Added value: +10
      • removedInput schema / properties / limit / description
        Removed value: -"Maximum number of jobs to return (default 20, max 100)."
      • removedInput schema / properties / status / description
        Removed value: -"Filter by job status."
      • removedInput schema / properties / status / enum
        Removed value: -[
        -  "pending",
        -  "queued",
        -  "running",
        -  "completed",
        -  "failed",
        -  "cancelled"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "has_more": {
        +          "type": "boolean"
        +        },
        +        "jobs": {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "created_at": {
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "job_id": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "status": {
        +                "type": "string"
        +              },
        +              "updated_at": {
        +                "type": "string"
        +              },
        +              "workload_type": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "limit": {
        +          "type": "number"
        +        },
        +        "next_cursor": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Removedstream_job_logs
    • Changedsubmit_job26 fields changed
      • addedInput schema / properties / args
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / command / description
        Removed value: -"Container entrypoint arguments (e.g. ['python', 'train.py', '--epochs', '10'])."
      • removedInput schema / properties / command / items
        Removed value: -{
        -  "type": "string"
        -}
      • changedInput schema / properties / command / type
        Previous value: -"array"New value: +"string"
      • removedInput schema / properties / cost_priority
        Removed value: -{
        -  "description": "Cost sensitivity.",
        -  "enum": [
        -    "low",
        -    "balanced",
        -    "high"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / disk_gb
        Removed value: -{
        -  "description": "Optional managed-provider local disk override in GB. Leave unset to let Jungle Grid auto-size from model_size_gb.",
        -  "type": "number"
        -}
      • addedInput schema / properties / env
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / environment
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "string"
        -  },
        -  "description": "Environment variables injected into the container. Use this for large inline scripts such as CODE when you want to keep the command array short.",
        -  "type": "object"
        -}
      • removedInput schema / properties / gpu_class
        Removed value: -{
        -  "description": "Optional soft GPU class preference.",
        -  "enum": [
        -    "consumer",
        -    "datacenter"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / gpu_type
        Removed value: -{
        -  "description": "Optional exact GPU override.",
        -  "enum": [
        -    "A100",
        -    "A10G",
        -    "H100",
        -    "L4",
        -    "RTX3090",
        -    "RTX4090",
        -    "RTX5090",
        -    "T4"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / huggingface_credential_id
        Removed value: -{
        -  "description": "Optional saved Hugging Face credential to inject into the managed runtime. Falls back to your account default when omitted.",
        -  "type": "string"
        -}
      • removedInput schema / properties / image / description
        Removed value: -"Docker image to run (e.g. 'pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime')."
      • removedInput schema / properties / latency_priority
        Removed value: -{
        -  "description": "Latency sensitivity. Use 'high' for real-time inference.",
        -  "enum": [
        -    "low",
        -    "balanced",
        -    "high"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / metadata
        Added value: +{
        +  "type": "object"
        +}
      • removedInput schema / properties / model_size_gb
        Removed value: -{
        -  "description": "Approximate model size in GB. Used to select the right GPU tier for inference jobs.",
        -  "type": "number"
        -}
      • removedInput schema / properties / name / description
        Removed value: -"Optional readable job name. A name is generated if omitted."
      • removedInput schema / properties / optimize_for
        Removed value: -{
        -  "description": "Scheduling optimization goal. 'speed' prioritises latency; 'cost' minimises spend.",
        -  "enum": [
        -    "balanced",
        -    "cost",
        -    "speed"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / region_mode
        Removed value: -{
        -  "description": "Region preference mode.",
        -  "enum": [
        -    "prefer",
        -    "strict"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / region_preference
        Removed value: -{
        -  "description": "Optional preferred region such as us-east or eu-west.",
        -  "type": "string"
        -}
      • addedInput schema / properties / routing_mode
        Added value: +{
        +  "enum": [
        +    "cost",
        +    "speed",
        +    "balanced"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / template
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / webhook_url
        Removed value: -{
        -  "description": "Optional HTTPS URL to receive signed lifecycle event callbacks.",
        -  "type": "string"
        -}
      • addedInput schema / properties / workload
        Added value: +{
        +  "enum": [
        +    "inference",
        +    "training",
        +    "fine_tuning",
        +    "batch"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / workload_type
        Removed value: -{
        -  "description": "Type of GPU workload.",
        -  "enum": [
        -    "inference",
        -    "training",
        -    "fine-tuning",
        -    "batch"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "workload_type",
        -  "image",
        -  "command"
        -]New value: +[
        +  "name",
        +  "workload",
        +  "image"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "estimated_cost_usd": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "max": {
        +              "type": "number"
        +            },
        +            "min": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "min",
        +            "max"
        +          ],
        +          "type": "object"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "job_id": {
        +          "type": "string"
        +        },
        +        "status": {
        +          "type": "string"
        +        },
        +        "status_message": {
        +          "type": "string"
        +        },
        +        "submitted_at": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data"
        +  ],
        +  "type": "object"
        +}
  2. 9 tool updatesv0.1.0
    • First observedcancel_job
    • First observedestimate_job
    • First observedget_artifact_download_url
    • First observedget_job
    • First observedget_job_logs
    • First observedlist_job_artifacts
    • First observedlist_jobs
    • First observedstream_job_logs
    • First observedsubmit_job

TDQS

A3.8/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct operation (submit, cancel, estimate, get status, get logs, list, get artifact, list artifacts) with no overlap. The separation between job management and artifact management is clear.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case (e.g., cancel_job, get_artifact, list_jobs). The naming is predictable and easy to understand.

Tool Count5/5

With 8 tools, the server provides a focused but complete set for managing Jungle Grid jobs. Each tool serves a necessary function without bloat or undersupply.

Completeness4/5

Covers the core job lifecycle (submit, get, list, cancel, estimate, logs, artifacts). Missing an update/retry tool for modifying job parameters, but the core workflow is well-supported.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    An MCP server for monitoring and managing multi-cluster Slurm GPU jobs, enabling AI agents to execute commands, check allocations, and explore logs across HPC clusters.
    1
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that enables agents to dynamically switch between multiple AI models (OpenAI, Anthropic, Google, etc.) with unified protocol-driven configuration and capability discovery.
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that converts SSH operations on training servers into AI-callable tools for GPU monitoring, job submission, file transfer, and more.
    1
    MIT