Your MCP server starts the job. Now it can tell the agent it's done.

No status tool to poll, no timeout to tune. One emit when the job finishes.

A background job, such as a render, a crawl, a build or a training run, finishes long after the tool call that started it returns. Your server knows the moment it's done. The agent that asked doesn't, and in most agents nothing tells it.

With Wakeshift, the tool that starts the job also subscribes the conversation. When the job finishes, your server calls emit, and that conversation picks up where it left off, in Claude Code, Codex, Cursor, Copilot CLI or whichever agent your user runs. Your user can start the job and walk away.

Try it in two minutes, no sign-up · Read the quickstart

What happens today

There are three usual answers, and each one breaks somewhere.

MCP's progress notifications don't help either: they travel inside a tool call that's still open, and stop when it returns.

How it works

On the MCP server you already run, the tool that starts the job subscribes the conversation that called it:

TypeScript
const crawlFinished = wake.defineEvent("crawl.finished", {
  description: "A site crawl finished",
  args: z.object({ crawl: z.string() }),
  payload: z.object({ status: z.string(), pages: z.number() }),
  text: (r, { crawl }) => `Crawl ${crawl} ${r.status}: ${r.pages} pages`,
})

const attached = wake.attach(server)

server.registerTool(
  "start_crawl",
  { description: "Crawl a site", inputSchema: attached.inputs(z.object({ url: z.string() })) },
  attached.events("start_crawl", { subscribes: [crawlFinished] }, async ({ url }, call) => {
    const crawl = await startCrawl(url)
    await call.subscribe(crawlFinished, { crawl })
    return `Crawl ${crawl} started. You'll hear back when it finishes.`
  }),
)

When the job ends, wherever your backend learns it (the code that finishes the job, a queue consumer, or a webhook handler you already have):

TypeScript
await crawlFinished.emit({ crawl }, { status: "done", pages: 1834 })

The agent wakes with "Crawl c81f done: 1834 pages", marked as coming from your app, and carries on: it reads the results with your tools, or tells the user. The SDKs are open source, for TypeScript, Python and Go, and any other language can use the HTTP API.

What your user sees

They ask for the crawl, and the agent says it'll pick it up when it's done. They go to lunch. When the crawl finishes, the agent wakes, in most agents within seconds, and continues the work they started together. If they closed the agent, what arrived is held until the conversation reconnects (what each agent needs after a restart).

When you don't need this

Next