MCP
Prompts & resources
Source: orchestration/mcp-gateway/prompts.ts (handlePromptList, handlePromptGet),
orchestration/mcp-gateway/resources.ts (handleResourceList, handleResourceRead),
orchestration/mcp-gateway/server.ts (resource templates, handler wiring),
orchestration/mcp-gateway/skill-dist.generated.ts, orchestration/mcp-gateway/llms-routes.ts,
MCP SDK 1.29.0 (types.js McpError, shared/protocol.js).
Besides its 22 tools, the server offers one prompt and five resources plus three
resource templates. They are read-only and run nothing, and they work on
https://mcp.plungeai.com/v1 and on the same server at https://api.plungeai.com/v1/mcp. All
content is live: registry listings come from the registry at request time, and workflow and
execution resources are read from your account with an ownership check. There is no static
manifest.
12.1 The /plungeai prompt
There is exactly one prompt. It activates the whole platform in one step. Earlier recipe prompts
(research pipeline, market research, …) were removed on purpose: they showed up as separate slash
commands and locked the client into one behaviour, when the tools already cover everything
(prompts.ts).
| Field | Value |
|---|---|
name | plungeai |
title | PlungeAI |
description | PlungeAI MCP |
arguments | one: request (string, optional), "What you want to accomplish (optional)" |
Using it in a client. Clients list MCP prompts in their slash-command or prompt menu. In
Claude Code the prompt appears as /plungeai:plungeai (MCP): type /plungeai to filter the menu
and pick it, or run /mcp__plungeai__plungeai directly (the middle part is the server name you
chose in claude mcp add). Claude Code splits any text after the command on whitespace, one word
per argument, so only the first word would reach request. Run the prompt bare, then type your
request as the next message. Other clients may offer a form field for request instead.
- run bare (no
request): the model is told to ask you what you want to accomplish; - with
requestset (for exampleresearch Tesla's Q2, from a client that offers the field): the model is told to handle that request now.
The prompt is a convenience, not a requirement. You can always just talk to your client normally.
prompts/list:
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"prompts/list"}'prompts/get returns description: "PlungeAI MCP" and one user message (type text). It runs
nothing, so it is free:
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"prompts/get","params":{"name":"plungeai","arguments":{"request":"research Tesla'"'"'s Q2"}}}'What the message tells the model:
- It now has the full platform through the
plungeai_*tools: about 90 active agents, CNL workflows, missions, long-term memory and execution history. - Discover. "Show me my agents/workflows" means saved workflows (
plungeai_list_workflows). The registry (plungeai_list_agentswith a natural-languagesearch) is for building blocks. Fetch a full card withagent_idbefore first use. - Execute.
plungeai_execute_agent(one agent, optionalsession_id),plungeai_execute_workflow(savedworkflow_idor ad-hoc CNL YAML),plungeai_run_mission(bounded autonomous loop with memory). - Results.
plungeai_get_result,plungeai_get_workflow_status(poll async runs),plungeai_executions, andplungeai_followup/plungeai_continuefor finished or paused runs. - Approvals. Relay any "⏸ AWAITING USER APPROVAL" or "⏸ AWAITING USER" block verbatim, never
approve on its own, then call
plungeai_continuewithapprove: trueor the user's words. - Build.
plungeai_build_workflowgenerates and saves a workflow.plungeai_workflowis direct CRUD.plungeai_memoryis long-term memory. - Always pass
user_request, the user's words verbatim. - The last line is either
Now handle this request: <request>(the argument is trimmed) orAsk the user what they want to accomplish.whenrequestis empty or absent.
An unknown prompt name is rejected with -32602. The SDK prefixes the message with
MCP error -32602::
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":3,"method":"prompts/get","params":{"name":"research"}}'12.2 Resources at a glance
resources/list returns five fixed resources (handleResourceList):
| URI | name | mimeType | Returns | Scope |
|---|---|---|---|---|
plungeai://agents/list | PlungeAI Agents | text/markdown | the active registry agents, up to 100, as registry Markdown | platform (active agents only) |
plungeai://agents/categories | Agent Categories | text/markdown | a category → agent-count table | platform (active agents only) |
plungeai://personas/list | Personas | text/markdown | persona cards, up to 100, as registry Markdown | platform |
plungeai://workflows/list | Your Workflows | text/markdown | your 50 most recently updated saved workflows | your account |
plungeai://docs/workflow-authoring | Workflow Authoring Guide | text/markdown | the full CNL workflow-authoring skill bundle | static |
resources/templates/list returns three URI templates (server.ts) for resources addressed by a
parameter:
uriTemplate | name | mimeType | Scope |
|---|---|---|---|
plungeai://agents/{category} | Agents by category | text/markdown | platform (active agents only) |
plungeai://workflows/{id} | Workflow YAML by id | text/yaml | your account, ownership-checked |
plungeai://executions/{id} | Execution result by id | text/markdown | your account, ownership-checked |
The resources and templates carry no size or annotations. The templates carry no description.
Every resources/read answers { "contents": [ { "uri", "mimeType", "text" } ] } with one entry.
The server's resources capability is {}: no subscribe and no listChanged
(Protocol & transport).
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":4,"method":"resources/list"}'curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":5,"method":"resources/templates/list"}'Resources or tools? A resource is the same data some tools return, in a form your client can
attach to a conversation without a tool call. For searching and filtering, use the tools:
plungeai_list_agents for a semantic search, plungeai_list_workflows for folders and search,
plungeai_get_result for one task's output (Discovery,
Runs, results & follow-ups).
12.3 plungeai://agents/list
The live registry of active agents: kind=agents&status=active&format=md&limit=100. The
Markdown starts # Registry search, then *<n> results*. Each agent follows under a
## Name (id) heading with its kind, category and status line, its description and a Good at
list. On 2026-09-24 the
registry listed 92 active agents (live-verified). The listing is large, about 150 KB, so attach
it only when you really want the whole catalog. For a normal question, a filtered
plungeai_list_agents search is far smaller.
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":6,"method":"resources/read","params":{"uri":"plungeai://agents/list"}}' \
| cut -c1-120012.4 plungeai://agents/categories
Active agents (up to 500) grouped by category into one table, largest first. An agent with no
category counts as general:
# Agent Categories (<n> agents, live registry)
| Category | Agents |
|:---|---:|
| google-workspace | … |
…
_Read `plungeai://agents/{category}` for the agents in one category._This is the cheap way to answer "what kinds of agents are there". On 2026-09-24 the registry held
92 active agents in 14 categories (live-verified): google-workspace, tools, search,
microsoft-365, ai, blockchain, communication, ecommerce-agents, payment,
entertainment, media, financials, shopping, coding-agents. Note the finance category is
financials, not finance.
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":7,"method":"resources/read","params":{"uri":"plungeai://agents/categories"}}'12.5 plungeai://personas/list
The persona registry: kind=personas&format=md&limit=100, as registry Markdown (a ## Name (id)
heading per persona, its kind and category, Good at). Unlike the agent resources, it has no status:active filter,
because no persona card carries that tag and the filter would empty the list (resources.ts). The
list stops at 100: on 2026-09-24 the registry answered *100 results*. For a specific persona,
search with plungeai_list_agents {"kind":"personas","search":"…"}. A persona id goes on
plungeai_execute_agent persona or a mission's persona
(Agents & missions).
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":8,"method":"resources/read","params":{"uri":"plungeai://personas/list"}}' \
| cut -c1-80012.6 plungeai://workflows/list
Your workflows: the 50 most recently updated saved workflows on your account (what users call
"my agents"). One bullet each (bold name, the id as code, then the description) under
# Your Workflows (<n>). With no saved workflows, the text is _No workflows yet._. It carries
no folders and no search. For those, use plungeai_list_workflows.
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":9,"method":"resources/read","params":{"uri":"plungeai://workflows/list"}}'12.7 plungeai://docs/workflow-authoring
The complete CNL workflow-authoring skill as one Markdown document: how to author, validate and
save CNL workflows, with examples. It is a static bundle built into the server and needs no data
access. The content is identical to GET https://mcp.plungeai.com/llms-full.txt, which needs no
key (61,309 bytes on 2026-09-24, live-verified). Attach it when you want your client to write CNL
YAML by hand (Workflows). The same skill is in the catalog at
https://skills.plungeai.com.
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":10,"method":"resources/read","params":{"uri":"plungeai://docs/workflow-authoring"}}' \
| cut -c1-60012.8 plungeai://agents/{category}
The active agents in one category, up to 100, as registry Markdown under
# Registry search — category=<category>. The category is passed to the registry as-is, so an
unknown or misspelled category is not an error. It returns an empty listing (*0 results*).
Take category names from plungeai://agents/categories.
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":11,"method":"resources/read","params":{"uri":"plungeai://agents/financials"}}'12.9 plungeai://workflows/{id}
The saved CNL YAML of one of your workflows, as text/yaml. The id is the workflow id from
plungeai_list_workflows or plungeai://workflows/list. The ownership check comes first: an id
that does not exist and an id owned by someone else get the same -32002 answer, so you cannot
probe for other accounts' ids. A workflow whose YAML body is missing from storage returns the text
No YAML content found.
# needs one of your workflow ids — not auto-verified
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":12,"method":"resources/read","params":{"uri":"plungeai://workflows/<workflow id>"}}'12.10 plungeai://executions/{id}
The stored result of one of your runs, by execution id (not the workflow id,
Troubleshooting). It reads the same stores as plungeai_get_result:
the stored result, then the final task's output. The document looks like this:
# Execution <execution id>
- **Workflow:** `<workflow id>`
## Result
<the run's final output>When there is no output, the Result section says why:
| Run state | ## Result text |
|---|---|
| failed | _This run failed: <error message>._ (or no error was recorded) |
| no output yet | _No result stored yet (may still be running)._ |
This resource gives the final result only. For one task's output, the full conversation thread, the
"Steps in this run" index or a paused run's ⏸ block, use plungeai_get_result
(Runs, results & follow-ups). An unknown id, or one that is not
yours, gets -32002 Execution not found: <id>.
# needs one of your execution ids — not auto-verified
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":13,"method":"resources/read","params":{"uri":"plungeai://executions/<execution id>"}}'12.11 Resource errors
resources/read answers JSON-RPC errors, not outcomes. The SDK prefixes McpError messages with
MCP error <code>: (types.js).
| Case | code | message |
|---|---|---|
| URI matches no resource or template | -32002 | MCP error -32002: Resource not found: <uri> |
plungeai://workflows/{id}: unknown or not yours | -32002 | MCP error -32002: Workflow not found: <id> |
plungeai://executions/{id}: unknown or not yours | -32002 | MCP error -32002: Execution not found: <id> |
| The registry answered non-2xx (agent, category and persona resources) | -32603 | Registry error <status> |
params.uri missing or not a string | -32603 | the SDK's raw schema-validation text (a zod issue list) |
curl -s https://mcp.plungeai.com/v1 \
-H "Authorization: Bearer $PLUNGE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":14,"method":"resources/read","params":{"uri":"plungeai://nope"}}'Registry-backed reads time out after 10 seconds. For the full error vocabulary, see Errors, feedback & limits.