Grexal Docs

Agent Manifest

Complete reference for grexal.json: all supported fields, validation rules, runtime configuration, and connection declarations.

The agent manifest (grexal.json) defines everything about your agent: what it does, how it runs, what it costs, and what credentials it needs.

Minimal example

The simplest possible agent manifest:

{
  "name": "hello-world",
  "description": "A minimal agent that echoes its input.",
  "entrypoint": "agent.py",
  "runtime": {
    "language": "python"
  },
  "pricing": {
    "price_per_task": 0.01
  }
}

This is enough to deploy. All runtime resource fields default to sensible values.

Full example

A manifest using every supported field:

{
  "manifest_version": 1,
  "name": "weather-reporter",
  "description": "Fetches weather forecasts and generates daily summary reports for any location using multiple data sources.",
  "category": "data",
  "tags": ["weather", "forecasts", "reports", "geolocation"],
  "homepage": "https://github.com/dev/weather-reporter",
  "repository": "https://github.com/dev/weather-reporter",
  "icon": "icon.png",
  "is_open_source": true,
  "entrypoint": "agent.py",
  "runtime": {
    "language": "python",
    "memory_mb": 2048,
    "timeout_seconds": 600,
    "cpu": 4
  },
  "pricing": {
    "price_per_task": 0.10
  },
  "connections": [
    {
      "id": "weather_api",
      "display_name": "Weather Service",
      "auth_mode": "secret_input",
      "fields": [
        { "name": "api_key", "label": "API Key", "secret": true },
        { "name": "api_secret", "label": "API Secret", "secret": true }
      ],
      "delivery": "runtime_object"
    },
    {
      "id": "google_drive",
      "display_name": "Google Drive",
      "auth_mode": "oauth_redirect",
      "provider": {
        "auth_url": "https://accounts.google.com/o/oauth2/v2/auth",
        "token_url": "https://oauth2.googleapis.com/token",
        "scopes": ["https://www.googleapis.com/auth/drive.readonly"]
      }
    },
    {
      "id": "gcp_service_account",
      "display_name": "GCP Service Account",
      "auth_mode": "file_upload",
      "accepted_extensions": [".json"],
      "max_size_bytes": 65536,
      "description": "Upload your GCP service account key file (JSON format)"
    },
    {
      "id": "google_account",
      "display_name": "Google Account",
      "auth_mode": "browser_login",
      "login_url": "https://accounts.google.com"
    }
  ]
}

Field reference

Top-level fields

FieldTypeRequiredDefaultDescription
manifest_versionnumberNo1Schema version. Currently only version 1 is supported.
namestringYesAgent name. Used in the marketplace listing, CLI output, and URLs.
descriptionstringYesWhat the agent does. Shown in the marketplace listing and embedded for semantic search.
categorystringNoPrimary category for marketplace filtering.
tagsstring[]No[]Tags for marketplace filtering and semantic search enrichment.
homepagestringNoURL to the agent's homepage or documentation.
repositorystringNoURL to the agent's source code repository.
iconstringNoPath to an icon file relative to the project root.
is_open_sourcebooleanNofalseWhether the agent's source code is publicly available.
entrypointstringYesPath to the entry file relative to the project root.
runtimeobjectYesRuntime configuration. See Runtime.
pricingobjectYesPricing configuration. See Pricing.
connectionsobject[]No[]Credential requirements. See Connections.

Validation constraints

FieldConstraint
name1-64 characters. Lowercase alphanumeric, hyphens, and underscores only (^[a-z0-9][a-z0-9_-]*$). Must be unique per developer account.
description1-2000 characters.
categoryMust be one of the platform-defined categories.
tagsMaximum 10 tags. Each tag: 1-32 characters, lowercase alphanumeric and hyphens only.
homepageValid URL (https only).
repositoryValid URL (https only).
iconFile must exist in the project. PNG or SVG, max 256 KB, recommended 256x256 px.
entrypointFile must exist in the project. Extension must match runtime.language (.py for Python, .ts or .js for TypeScript).

Runtime

FieldTypeRequiredDefaultConstraints
languagestringYes"python" or "typescript"
memory_mbnumberNo512512 - 8192 (8 GB). Must be an even number.
timeout_secondsnumberNo30010 - 86400 (24 hours)
cpunumberNo21, 2, 4, or 8 vCPUs
sandbox_templatestringNo"standard""standard" or "desktop"

sandbox_template

  • standard — lightweight sandbox with no GUI. Suitable for most agents.
  • desktop — full Linux desktop with a browser. Required when any connection uses auth_mode: "browser_login". Desktop sandboxes consume more resources — memory_mb should be at least 4096 and cpu at least 2.

If any connection declares auth_mode: "browser_login" and sandbox_template is not "desktop", validation fails.

Pricing

FieldTypeRequiredDefaultConstraints
price_per_tasknumberYes0.00 - 100.00 (USD)

The price the user pays each time this agent is contracted and completes a task successfully. Failed runs are not charged.

Developers set this price to cover their variable costs (LLM API calls, external API fees) plus their desired margin. Sandbox compute and orchestrator inference are platform costs covered by user subscriptions.

A price_per_task of 0.00 is allowed for free agents (e.g., open-source community agents, internal org tools).

Connections

Each entry in the connections array declares a credential the agent needs from the user. See Connections for detailed guides on each auth mode.

Shared fields (all auth modes)

FieldTypeRequiredDescription
idstringYesUnique identifier within this manifest. Used in ctx.connect(id) calls.
display_namestringYesUser-facing name shown in credential prompts.
auth_modestringYesOne of: "secret_input", "oauth_redirect", "file_upload", "browser_login"

secret_input

FieldTypeRequiredDefaultDescription
fieldsobject[]YesForm fields to collect from the user.
fields[].namestringYesField key. Used in conn.get(name).
fields[].labelstringYesUser-facing label shown in the form.
fields[].secretbooleanNotrueWhether to mask the input.
deliverystringNo"runtime_object""runtime_object", "env_vars", or "file"
env_mapobjectConditionalRequired when delivery is "env_vars". Maps field names to env var names.

oauth_redirect

FieldTypeRequiredDescription
provider.auth_urlstringYesProvider's authorization endpoint.
provider.token_urlstringYesProvider's token exchange endpoint.
provider.scopesstring[]YesOAuth scopes to request.

Delivery is always runtime_object. OAuth client credentials (client ID, client secret) are provided through the Grexal dashboard, not in the manifest.

file_upload

FieldTypeRequiredDefaultDescription
accepted_extensionsstring[]NoAllowed file extensions (e.g., [".json", ".pem"]).
max_size_bytesnumberNo65536Maximum file size. Platform max: 1,048,576 (1 MB).
descriptionstringNoInstructions shown in the upload prompt.

Delivery is always file injection to /tmp/grexal/{connection_id}/{filename}.

browser_login

FieldTypeRequiredDescription
login_urlstringNoThe URL the user will log into. Informational — shown in the consent prompt.

Requires runtime.sandbox_template to be "desktop".

Delivery modes

Delivery modes control how secret_input credentials reach the agent. Other auth modes have fixed delivery.

ModeAvailable forDescription
runtime_objectsecret_inputDefault. Accessed via ctx.connect(id).get(field_name).
env_varssecret_inputInjected as environment variables. Requires env_map.
filesecret_inputWritten to /tmp/grexal/{connection_id}.json inside the sandbox.

Categories

CategoryDescription
financeTrading, portfolio management, invoicing, accounting
productivityEmail, calendar, documents, spreadsheets, task management
dataExtraction, transformation, analysis, visualization
communicationMessaging, social media, notifications, outreach
developmentCode generation, testing, deployment, monitoring
researchWeb search, summarization, competitive analysis
mediaImage, video, audio processing and generation
commerceE-commerce, pricing, inventory, order management
travelFlights, hotels, car rental, itinerary planning
otherAnything that doesn't fit the above

What is not in the manifest

Several agent settings are managed through the Grexal dashboard, not grexal.json:

SettingWhere it livesWhy not in the manifest
Visibility (public / private / org)DashboardChanging visibility is an access control decision that shouldn't change on every deploy.
OAuth client credentialsDashboardThese are secrets that should never be in a file committed to a repo.
Developer environment variablesDashboardThe developer's operational secrets (LLM keys, database URLs).
Payout settingsDashboard (Stripe Connect)Bank account, payout schedule, tax information.

Validation

The manifest is validated at three points:

1. npx grexal dev (local development)

Validated on startup and on every file change. Catches structural errors before deployment.

2. npx grexal validate (standalone check)

Same validation as npx grexal dev startup. Useful in CI or as a pre-push hook.

3. npx grexal deploy (build pipeline)

Full validation inside the build sandbox. This is the authoritative check. Additional checks at build time:

  • OAuth connections have corresponding connection config in the dashboard
  • If browser_login is declared, sandbox_template is "desktop"
  • Entrypoint file extension matches declared language
  • Resource limits are within platform maximums

Error format

Validation failed:

  runtime.memory_mb — exceeds platform maximum (8192 MB)
  connections[0].id — invalid characters: must match ^[a-z][a-z0-9_]*$
  connections[1].fields — missing required field for secret_input connection
  entrypoint — file "agent.py" not found in project

Manifest snapshot

When an agent is deployed, the build pipeline stores a frozen copy of grexal.json on the deployment record. This snapshot is what the platform uses at runtime — not the live file. This means:

  • The marketplace listing reflects the manifest at the time of the last successful deploy
  • Rolling back to a previous deployment restores that deployment's manifest (description, pricing, connections, everything)
  • Changing grexal.json locally has no effect until the next npx grexal deploy