Koskamo

Ephemeral MCP

An official MCP server provided by Ephemeral that allows AI agents to execute bounded, isolated tasks in microVMs. It supports creating and managing runs, workflows, and schedules, with features like cost caps, zero data retention, and scoped connections for secure, auditable AI agent operations.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Ephemeral MCP logo, by EphemeralVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Ephemeral
You need:Create an API key under Keys in the dashboardA member key covers runs, workflows and filesuse an admin key if the agent should also create, change or delete schedules
MCP endpoint (Streamable HTTP)
https://app.ephemer.al/mcp
Vendor documentation

What you can do with it

  • Execute isolated AI agent tasks with strict cost and time limits
  • Manage saved workflows and scheduled recurring jobs
  • Process data in sandboxes with zero data retention
  • Monitor status pages or metrics via automated runs

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
ephemeral 2026.10.29.3-9076513
MCP protocol
2025-06-18
Tools
19 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Ephemeral runs an AI agent task in an isolated sandbox. Call create_run with a prompt (or a saved workflow), then wait_for_run for the result. Every run has a cost cap; connections are the organization's saved, scoped references. Workflows can be saved and deleted (save_workflow, delete_workflow), and schedules created, changed, paused, previewed, run now and deleted (the schedule tools); changing a schedule needs an administrator key. list_files shows the organization's files.

Tools

19 advertised

create_run — Create a run
Advertised by the server during the last successful anonymous check.
Open-world

Start an AI agent run in an isolated sandbox and return the run (status queued) at once. Give a prompt, or the name of a saved workflow. Poll with get_run or block with wait_for_run for the result. Every run has a cost cap (max_cost_micros) and a timeout, and is billed to the organization of the API key. Connections must already be saved in the organization; reference them by name. Use idempotency_key to make a retry safe. A run's cost_micros is provisional (usually above the final cost) until cost_final is true; see get_run. On the hosted service a run costs a run fee once its worker starts, compute per second, model calls at the provider's price plus a percentage, and web requests and searches at flat prices; `GET /v1/me` reports the rates.

create_run input schema
{
  "type": "object",
  "properties": {
    "web": {
      "oneOf": [
        {
          "type": "boolean"
        },
        {
          "type": "object",
          "properties": {
            "allow": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Domains the agent may fetch, such as \"api.github.com\" or \"*.example.com\". Empty allows every public domain."
            },
            "search": {
              "type": "boolean",
              "description": "Whether web search is available (default true)."
            }
          },
          "additionalProperties": false
        }
      ],
      "description": "Web access: true, false, or an object limiting it."
    },
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "path"
        ],
        "properties": {
          "file": {
            "type": "string",
            "description": "Id of a saved file (instead of content)."
          },
          "path": {
            "type": "string",
            "description": "Where the file appears in the sandbox."
          },
          "content": {
            "type": "string",
            "description": "Inline text content."
          }
        },
        "additionalProperties": false
      },
      "description": "Files placed in the sandbox: inline content, or a file saved in the organization."
    },
    "input": {
      "description": "Any JSON the agent receives as its input. If the workflow has an input_schema, it must match."
    },
    "model": {
      "type": "string",
      "description": "A model id from list_models. Omit for the default."
    },
    "shell": {
      "type": "boolean",
      "description": "Whether the agent may run shell commands in its sandbox."
    },
    "prompt": {
      "type": "string",
      "description": "What the agent should do. Required unless workflow is set."
    },
    "workflow": {
      "type": "string",
      "description": "Name of a saved workflow to run instead of a prompt (see list_workflows)."
    },
    "connections": {
      "type": "object",
      "description": "Saved connections the agent may use, keyed by the name the agent sees. Each refers to a connection saved in the organization and can only narrow it.",
      "additionalProperties": {
        "type": "object",
        "required": [
          "ref"
        ],
        "properties": {
          "ref": {
            "type": "string",
            "description": "Name of the saved connection (see list_connections)."
          },
          "allowed_tools": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tool names allowed on an MCP connection."
          },
          "allowed_methods": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "HTTP methods allowed, for example [\"GET\"] for read-only access."
          }
        },
        "additionalProperties": false
      }
    },
    "description": {
      "type": "string",
      "maxLength": 500,
      "description": "What the workflow does and what input it expects, in a sentence or two, for people and agents. At most 500 characters."
    },
    "input_schema": {
      "type": "object",
      "description": "A JSON Schema (draft 2020-12 or 7, at most 32 KiB, no references to other documents) that this run's input must match. A run whose input does not match is refused with the path and the reason, such as \"input.city: required\"."
    },
    "output_schema": {
      "type": "object",
      "description": "A JSON Schema (draft 2020-12 or 7, at most 32 KiB, no references to other documents) that this run's output must match. The agent is told the schema and asked to reply with JSON only; the output is then checked, and a run whose output does not match fails with the reason."
    },
    "idempotency_key": {
      "type": "string",
      "description": "A retry with the same key returns the original run instead of starting another."
    },
    "max_cost_micros": {
      "type": "integer",
      "minimum": 1,
      "description": "Cost cap in millionths of a dollar. The run stops at the cap."
    },
    "timeout_seconds": {
      "type": "integer",
      "minimum": 1,
      "description": "Wall-clock limit for the run."
    },
    "zero_data_retention": {
      "type": "boolean",
      "description": "Record nothing of the run's content; the output is kept only briefly and released on first retrieval."
    }
  },
  "additionalProperties": false
}
create_run annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_run — Get a run
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read a run: status, output, error, cost and billing_pending. COST: while billing_pending is true (or the run is still going), cost_micros is PROVISIONAL and usually higher than the final cost; the result then has cost_final:false and a cost_note. Quote a cost only when cost_final is true (the run is finished and billing_pending is false); otherwise call get_run again in a few seconds. For a zero-data-retention run the first read of a finished run returns the output and then deletes it. On the hosted service a run costs a run fee once its worker starts, compute per second, model calls at the provider's price plus a percentage, and web requests and searches at flat prices; `GET /v1/me` reports the rates.

get_run input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The run's id, as returned by create_run."
    }
  },
  "additionalProperties": false
}
get_run annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
wait_for_run — Wait for a run
Advertised by the server during the last successful anonymous check.
Advertised read-only

Wait until a run finishes (succeeded, failed, cancelled, interrupted or timed_out) or the wait ends, then return the run. After the run finishes it keeps waiting, within the same time, until billing has settled (billing_pending false, normally a few seconds to about 20), so the cost is final. Waits at most 60 seconds; if the run is still going, the returned status says so and you can call it again. COST: if the result has cost_final:false, cost_micros is PROVISIONAL and usually higher than the final cost; do not quote it, call get_run again shortly. Quote the cost only when cost_final is true.

wait_for_run input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The run's id, as returned by create_run."
    },
    "timeout_seconds": {
      "type": "integer",
      "maximum": 60,
      "minimum": 1,
      "description": "How long to wait, 1 to 60 (default 30)."
    }
  },
  "additionalProperties": false
}
wait_for_run annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_runs — List runs
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the organization's runs, newest first, with a cursor for the next page. Each run has cost_final: when false, cost_micros is provisional (usually above the final cost) and billing is still settling.

list_runs input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Page size (default 20)."
    },
    "cursor": {
      "type": "string",
      "description": "next_cursor from the previous page."
    },
    "status": {
      "enum": [
        "queued",
        "reserving",
        "starting",
        "running",
        "succeeded",
        "failed",
        "cancelled",
        "interrupted",
        "timed_out"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
list_runs annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
cancel_run — Cancel a run
Advertised by the server during the last successful anonymous check.
Advertised destructive

Cancel a run that has not finished. Work already done is billed. Cancelling a finished run changes nothing.

cancel_run input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The run's id, as returned by create_run."
    }
  },
  "additionalProperties": false
}
cancel_run annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
list_workflows — List workflows
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the organization's saved workflows (reusable run definitions). Each entry has the workflow's name and, when set, its description, input_schema (the shape of the input create_run expects) and output_schema (the shape of the JSON it returns), so you can call a workflow without reading its prompt. Run one with create_run and its name.

list_workflows input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_workflows annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_workflow — Get a workflow
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read a saved workflow's definition: description, prompt, model, files, connections, limits and its input_schema and output_schema. Credentials are never included.

get_workflow input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "The workflow's name."
    }
  },
  "additionalProperties": false
}
get_workflow annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_models — List models
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find models. Returns a compact list (id, name, context_length, input and output USD per million tokens, zero_data_retention where known), the total count and the default model. There are hundreds of models, so filter with query (case-insensitive part of the id or name, e.g. "claude", "gpt") and read the hint when the list is truncated (default 25, at most 100). Pass model for one model's full details. Use an id from it as create_run's model.

list_models input schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Same as model."
    },
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "How many models to return (default 25)."
    },
    "model": {
      "type": "string",
      "description": "A model id: return the full details of exactly that model."
    },
    "query": {
      "type": "string",
      "description": "Case-insensitive text to find in the model id or name, e.g. \"claude\"."
    },
    "zero_data_retention": {
      "type": "boolean",
      "description": "true: only models that have a zero-data-retention endpoint."
    }
  },
  "additionalProperties": false
}
list_models annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_connections — List connections
Advertised by the server during the last successful anonymous check.
Advertised read-only

The organization's saved connections that a run may use, with type, allowed methods and tools. No URLs or secrets are returned. Reference one in create_run by name.

list_connections input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_connections annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
save_workflow — Save a workflow
Advertised by the server during the last successful anonymous check.

Create a workflow, or replace the one with this name (saving the same definition again changes nothing more). A workflow is a reusable run definition: start it with create_run and its name, or on a timetable with create_schedule. Connections must already be saved in the organization; reference them by name, never with a URL or a credential. Read the current definition with get_workflow first when you change part of it, because saving replaces the whole definition. Give it a description, and an input_schema and output_schema (JSON Schemas) so that agents can discover and call it: a run's input is checked against input_schema before it starts, and its output must be JSON matching output_schema or the run fails.

save_workflow input schema
{
  "type": "object",
  "required": [
    "name",
    "prompt"
  ],
  "properties": {
    "web": {
      "oneOf": [
        {
          "type": "boolean"
        },
        {
          "type": "object",
          "properties": {
            "allow": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Domains the agent may fetch, such as \"api.github.com\" or \"*.example.com\". Empty allows every public domain."
            },
            "search": {
              "type": "boolean",
              "description": "Whether web search is available (default true)."
            }
          },
          "additionalProperties": false
        }
      ],
      "description": "Web access: true, false, or an object limiting it."
    },
    "name": {
      "type": "string",
      "description": "The workflow's name: letters, digits, dots, dashes and underscores."
    },
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "path"
        ],
        "properties": {
          "file": {
            "type": "string",
            "description": "Id of a saved file (see list_files), instead of content."
          },
          "path": {
            "type": "string",
            "description": "Where the file appears in the sandbox, a relative path."
          },
          "content": {
            "type": "string",
            "description": "Inline text content (maximum 1 MiB)."
          }
        },
        "additionalProperties": false
      },
      "description": "Files placed in the sandbox (at most 32): inline content, or a file saved in the organization."
    },
    "model": {
      "type": "string",
      "description": "A model id from list_models. Omit for the default."
    },
    "shell": {
      "type": "boolean",
      "description": "Whether the agent may run shell commands in its sandbox."
    },
    "prompt": {
      "type": "string",
      "description": "What the agent should do (maximum 128 KiB)."
    },
    "connections": {
      "type": "object",
      "description": "Saved connections the agent may use (at most 16), keyed by the name the agent sees. Each refers to a connection saved in the organization and can only narrow it.",
      "additionalProperties": {
        "type": "object",
        "required": [
          "ref"
        ],
        "properties": {
          "ref": {
            "type": "string",
            "description": "Name of the saved connection (see list_connections)."
          },
          "allowed_tools": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tool names allowed on an MCP connection."
          },
          "allowed_methods": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "HTTP methods allowed, for example [\"GET\"] for read-only access."
          }
        },
        "additionalProperties": false
      }
    },
    "description": {
      "type": "string",
      "maxLength": 500,
      "description": "What the workflow does and what input it expects, in a sentence or two, for people and agents. At most 500 characters."
    },
    "input_schema": {
      "type": "object",
      "description": "A JSON Schema (draft 2020-12 or 7, at most 32 KiB, no references to other documents) that each run of this workflow's input must match. A run whose input does not match is refused with the path and the reason, such as \"input.city: required\"."
    },
    "output_schema": {
      "type": "object",
      "description": "A JSON Schema (draft 2020-12 or 7, at most 32 KiB, no references to other documents) that each run of this workflow's output must match. The agent is told the schema and asked to reply with JSON only; the output is then checked, and a run whose output does not match fails with the reason."
    },
    "timeout_seconds": {
      "type": "integer",
      "maximum": 3600,
      "minimum": 1,
      "description": "Wall-clock limit for each run."
    },
    "zero_data_retention": {
      "type": "boolean",
      "description": "Record nothing of the runs' content; the output is kept only briefly and released on first retrieval."
    }
  },
  "additionalProperties": false
}
save_workflow annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
delete_workflow — Delete a workflow
Advertised by the server during the last successful anonymous check.
Advertised destructive

Permanently delete a saved workflow. Runs already started are not affected; schedules that use it stop being able to start runs until it is saved again.

delete_workflow input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "The workflow's name."
    }
  },
  "additionalProperties": false
}
delete_workflow annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
list_schedules — List schedules
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the organization's schedules: each starts a saved workflow on a cron timetable. Includes the next start, the last run and the last error.

list_schedules input schema
{
  "type": "object",
  "properties": {
    "workflow": {
      "type": "string",
      "description": "Only the schedules of this workflow."
    }
  },
  "additionalProperties": false
}
list_schedules annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_schedule — Get a schedule
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read a schedule: timetable, time zone, input, cost cap, whether it is enabled, its next start and the outcome of its last start.

get_schedule input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The schedule's id (sch_…), as returned by create_schedule or list_schedules."
    }
  },
  "additionalProperties": false
}
get_schedule annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_schedule — Create a schedule
Advertised by the server during the last successful anonymous check.

Start a saved workflow on a timetable. Needs an administrator key. Each start is a run billed to the organization, with the cost cap given here (or the default). Use preview_schedule first to check the timetable. A schedule pauses itself after repeated failed starts. An organization can have 50 schedules.

create_schedule input schema
{
  "type": "object",
  "required": [
    "workflow",
    "cron"
  ],
  "properties": {
    "cron": {
      "type": "string",
      "description": "Five fields (minute hour day-of-month month day-of-week), such as \"0 9 * * 1-5\", or a descriptor such as @daily or @every 15m. At most once a minute."
    },
    "name": {
      "type": "string",
      "maxLength": 128,
      "description": "A label for the schedule."
    },
    "input": {
      "description": "Any JSON the agent receives as its input on every start (maximum 1 MiB)."
    },
    "enabled": {
      "type": "boolean",
      "description": "Whether the schedule starts runs (default true)."
    },
    "timezone": {
      "type": "string",
      "description": "IANA time zone name, such as Europe/Madrid (default UTC)."
    },
    "workflow": {
      "type": "string",
      "description": "Name of the saved workflow to run (see list_workflows)."
    },
    "max_cost_micros": {
      "type": "integer",
      "maximum": 100000000,
      "minimum": 1,
      "description": "Cost cap of each run, in millionths of a dollar."
    },
    "skip_if_running": {
      "type": "boolean",
      "description": "Skip a start while the previous run is still going (default true)."
    }
  },
  "additionalProperties": false
}
create_schedule annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
update_schedule — Update or pause a schedule
Advertised by the server during the last successful anonymous check.

Change a schedule; only the fields you give change. Needs an administrator key. Set enabled to false to pause it and to true to resume it (resuming clears the failures that paused it). A new timetable counts from now.

update_schedule input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The schedule's id (sch_…), as returned by create_schedule or list_schedules."
    },
    "cron": {
      "type": "string",
      "description": "Five fields (minute hour day-of-month month day-of-week) or a descriptor such as @daily or @every 15m."
    },
    "name": {
      "type": "string",
      "maxLength": 128,
      "description": "A label for the schedule."
    },
    "input": {
      "description": "Any JSON the agent receives as its input on every start (maximum 1 MiB)."
    },
    "enabled": {
      "type": "boolean",
      "description": "false pauses the schedule, true resumes it."
    },
    "timezone": {
      "type": "string",
      "description": "IANA time zone name, such as Europe/Madrid."
    },
    "workflow": {
      "type": "string",
      "description": "Name of the saved workflow to run."
    },
    "max_cost_micros": {
      "type": "integer",
      "maximum": 100000000,
      "minimum": 1,
      "description": "Cost cap of each run, in millionths of a dollar."
    },
    "skip_if_running": {
      "type": "boolean",
      "description": "Skip a start while the previous run is still going."
    }
  },
  "additionalProperties": false
}
update_schedule annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
delete_schedule — Delete a schedule
Advertised by the server during the last successful anonymous check.
Advertised destructive

Permanently delete a schedule. Needs an administrator key. Runs it already started are not affected. To stop it for a while, pause it with update_schedule instead.

delete_schedule input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The schedule's id (sch_…), as returned by create_schedule or list_schedules."
    }
  },
  "additionalProperties": false
}
delete_schedule annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
preview_schedule — Preview a timetable
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check a cron expression and time zone and return the next five start times (UTC), without saving anything.

preview_schedule input schema
{
  "type": "object",
  "required": [
    "cron"
  ],
  "properties": {
    "cron": {
      "type": "string",
      "description": "Five fields (minute hour day-of-month month day-of-week) or a descriptor such as @daily or @every 15m."
    },
    "timezone": {
      "type": "string",
      "description": "IANA time zone name, such as Europe/Madrid (default UTC)."
    }
  },
  "additionalProperties": false
}
preview_schedule annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
run_schedule — Run a schedule now
Advertised by the server during the last successful anonymous check.
Open-world

Start the schedule's workflow now, outside its timetable, with the schedule's input and cost cap. Returns the queued run (follow it with wait_for_run); each call starts another run and is billed like any run.

run_schedule input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The schedule's id (sch_…), as returned by create_schedule or list_schedules."
    }
  },
  "additionalProperties": false
}
run_schedule annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
list_files — List files
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the files saved in the organization: id, name, size, content type and creation time. Reference a file by id in a run's or workflow's files. Read-only; upload and delete files through the REST API.

list_files input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_files annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1084 ms
95th percentile latency
1084 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1084 ms · metadata changed · 19 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http ephemeral-mcp https://app.ephemer.al/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add ephemeral-mcp --url https://app.ephemer.al/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable ephemeral-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "ephemeral-mcp": {
      "url": "https://app.ephemer.al/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "ephemeral-mcp": {
      "type": "streamableHttp",
      "url": "https://app.ephemer.al/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start ephemeral-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "ephemeral-mcp": {
      "type": "http",
      "url": "https://app.ephemer.al/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http ephemeral-mcp https://app.ephemer.al/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "ephemeral-mcp": {
      "url": "https://app.ephemer.al/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "ephemeral-mcp": {
      "serverUrl": "https://app.ephemer.al/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Ephemeral MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Ephemeral MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing