Official MCP server
The official qbash MCP server gives any MCP client one URL for your qbash account:
https://mcp.qbash.com/mcp
Sign in with your qbash account and the client can list and run your tasks, read their results and logs, build new tasks with the task builder, and create, search and update memory folders. It suits anyone who wants qbash in Claude, ChatGPT, Codex, Cursor or Claude Code before they build a custom server.
Every tool runs as you, with your own permissions. A client sees the tasks you can run and the memory folders you can read, and changes only what you could change in qbash itself.
Connecting a client
In qbash, open MCP Servers and choose Official qbash MCP server at the top of the list. Its page shows the setup for each client, with the URL filled in. In Claude Code, for example:
claude mcp add --transport http qbash https://mcp.qbash.com/mcp
Then run /mcp in Claude Code, select qbash and finish the sign-in in your browser. Codex uses codex mcp add qbash --url https://mcp.qbash.com/mcp followed by codex mcp login qbash.
If you belong to more than one organization, the sign-in connects to the one you last used in qbash. To switch, open the other organization in qbash and sign the client in again. The server's page in qbash also lists the apps signed in to it, so you can sign one out.
Building tasks from your client
The Tasks tools include the same task builder as the task editor. build_task takes a description, or a SPEC.md contract with tests, and returns a session your client polls until the builder's turn ends. The task is created when the first turn ends, and each later turn saves its changes. revise_task continues work on an existing task the same way.
Before a task runs for real, run_tests runs its tests against a mocked SDK and preview_task runs it once with writes to connected systems blocked. run_task starts a production run, and get_task_result waits for it and returns the output. For a run that went wrong, get_task_log gives its numbered steps and errors, and get_task_log_steps reads a step's inputs and result.
With the builder, a request your client would otherwise repeat becomes a tested task, written once as code, that runs the same way every time from any client.
Connectors
The official server lists connectors and their SDK operations, so a client can see what a task could use and look up exact signatures with describe_mode. It does not call connector operations itself.
When a client needs a connector you have not connected, request_connector returns a link to that connector's page in qbash, where you connect the account. To let a client call a connector's operations directly, add the account to a custom server.
Memory folders
The Memories tools read, search and add documents in the folders you can access. memories_create_folder makes a new folder owned by you and private until you share it in qbash. It supports keyword search and exact lookups. Searching a folder by meaning is a setting you turn on in qbash, and memories_vector_search works on folders that have it.
When to build a custom server
A custom server serves the tasks, connector accounts and memory folders you choose, under tool names and instructions you write, and you decide who in your organization can connect to it. Build one to give a team a fixed set of tools, to share a connector account without sharing its credentials, or to publish a task as a single tool.
Tool reference
The list below covers every tool the official server serves and its parameters. Open a tool for an example call.
Tasks
Find, run, build and test tasks you can access, read their runs and change their triggers.
list_tasksList tasks you can run, each with its latest run's status. Call read_task before reusing or revising one.
{
"name": "list_tasks",
"arguments": {}
}
Reads only. Clients that ask before calling tools can treat it as safe.
run_taskStart a production run of a task you may run. Returns execution_id for get_task_result, get_task_log and monitor_task_log.
{
"name": "run_task",
"arguments": {
"id_or_slug": "<id_or_slug>"
}
}
id_or_slugstringrequiredTask UUID or exact task name.
inputsobject
Changes data in qbash, or starts work that does.
build_taskBuild a new task with the task builder from the task editor, starting from a description, or from a SPEC.md contract and tests. The task is created when the first turn ends, and each later turn saves its changes when it ends. Returns session_id. Call again with session_id to read progress, add message to continue, or pass answer to reply to a question. The result of a saved turn carries the task_id.
{
"name": "build_task",
"arguments": {}
}
answerobjectReply to the builder's open question: gate_id from the question, and value.
descriptionstringWhat the task should do.
messagestringInstructions for a new build, or a follow-up message for an existing session.
namestringTask name for a new build.
session_idstringSession id returned when the build started.
specstringSPEC.md contents.
task_idstringOptional. The id of the task this build created.
testsstringtests.py contents for a Python task.
wait_secondsintegerSeconds to wait for the run to finish before answering. Defaults to 45s. Pass 0 to check without waiting.
Changes data in qbash, or starts work that does.
get_task_resultGet the output of a task run. Pass task_id for its latest finished run, scheduled ones included, or execution_id for one run. With an execution_id from run_task, it waits for the run to finish before answering, so call it again right away while the run is still going. A long output comes in windows: pass output_offset for the next one. A run that failed answers with its error.
{
"name": "get_task_result",
"arguments": {}
}
execution_idstringExecution id of one run, such as one run_task returned.
output_offsetintegerCharacter offset into the output, for the next window of a long one.
task_idstringTask id, for its latest finished run.
wait_secondsintegerSeconds to wait for the run to finish before answering. Defaults to 45s. Pass 0 to check without waiting.
Reads only. Clients that ask before calling tools can treat it as safe.
get_task_logGet one task run's log: its status, revision, attempts, numbered step outline, errors and an output preview. Pass execution_id, or task_id and run for any recorded run. get_task_result has the full output, and get_task_log_steps the step details.
{
"name": "get_task_log",
"arguments": {}
}
attemptintegerAttempt number.
execution_idstringExecution id, such as one run_task returned.
runstringExecution id, latest or latest_failed. Defaults to latest.
task_idstringTask id for recorded history.
wait_secondsintegerSeconds to wait for the run to finish before answering. Defaults to 45s. Pass 0 to check without waiting.
Reads only. Clients that ask before calling tools can treat it as safe.
preview_taskRun the task once with writes to connected systems blocked. Returns job_id. Call again with task_id and job_id for the result.
{
"name": "preview_task",
"arguments": {
"task_id": "<task_id>"
}
}
task_idstringrequiredTask id.
inputsobjectjob_idstringJob id returned when the preview started.
wait_secondsintegerSeconds to wait for the run to finish before answering. Defaults to 45s. Pass 0 to check without waiting.
Changes data in qbash, or starts work that does.
search_tasksSearch tasks you can run by name or description.
{
"name": "search_tasks",
"arguments": {}
}
querystringWords from the task name or description.
Reads only. Clients that ask before calling tools can treat it as safe.
read_taskRead one task: its inputs, triggers, tests, latest run, the MCP servers that serve it, and (when you may edit it) its script and connector bindings.
{
"name": "read_task",
"arguments": {
"task_id": "<task_id>"
}
}
task_idstringrequiredTask id.
Reads only. Clients that ask before calling tools can treat it as safe.
list_task_runsList recent runs, newest first, from any trigger, such as schedules and MCP calls. Pass task_id to list the runs of a task you can access. If you can only run that task, you see the runs you started. Without task_id, lists the runs of this server's own tasks, and tool narrows that to one of them. Test runs and previews are left out. Inputs are shown only for runs you started. For a run's result and steps, pass its task_id, and its execution_id as run, to get_task_log.
{
"name": "list_task_runs",
"arguments": {}
}
limitintegerMax results (default 10, max 50)
statusstringOnly runs with this status
One of
queued,running,awaiting_retry,terminating,cancelled,stopped,success,error,timeout.task_idstringA task id, such as one list_tasks returns. Required when this server serves no tasks.
toolstringOne of this server's task tool names, to list only that task's runs
Reads only. Clients that ask before calling tools can treat it as safe.
get_task_log_stepsRead the steps of one task run: each step's inputs, results and errors, filtered and paged. Pass execution_id for a run started by run_task, or task_id and run. Use the # step numbers from get_task_log as from_order and to_order. Each listed step shows its id: pass that as step_id with field to read the step's full inputs or result a window at a time.
{
"name": "get_task_log_steps",
"arguments": {}
}
attemptintegerAttempt number.
execution_idstringExecution id returned by run_task.
fieldstringinputs or result.
from_orderintegerFirst step order.
limitintegerMaximum steps.
max_charsintegerCharacter limit.
offsetintegerCharacter offset.
runstringExecution id, latest or latest_failed. Defaults to latest.
searchstringFilter step content.
statusstringFilter by step status.
step_idstringExact step id.
step_namestringFilter by step name.
task_idstringTask id for recorded history.
to_orderintegerLast step order.
Reads only. Clients that ask before calling tools can treat it as safe.
monitor_task_logRead new qbash.log lines while an authorized task execution is running.
{
"name": "monitor_task_log",
"arguments": {
"execution_id": "<execution_id>"
}
}
execution_idstringrequiredExecution id.
afterintegerNumber of lines already read.
Reads only. Clients that ask before calling tools can treat it as safe.
revise_taskChange an existing task with the task builder from the task editor: its script, inline prompts and scripts, inputs, settings and triggers. Use it for every schedule or webhook change, such as adding, moving, pausing or removing a schedule. Each turn saves its changes to the task when it ends. Returns session_id. Call again with task_id and session_id to read progress, add message to continue, or pass answer to reply to a question.
{
"name": "revise_task",
"arguments": {
"task_id": "<task_id>"
}
}
task_idstringrequiredTask id.
answerobjectReply to the builder's open question: gate_id from the question, and value.
messagestringRequested changes, or a follow-up message.
session_idstringSession id returned when the revision started.
wait_secondsintegerSeconds to wait for the run to finish before answering. Defaults to 45s. Pass 0 to check without waiting.
Changes data in qbash, or starts work that does.
run_testsRun the task's tests with a mocked SDK. Returns job_id. Call again with task_id and job_id for the result.
{
"name": "run_tests",
"arguments": {
"task_id": "<task_id>"
}
}
task_idstringrequiredTask id.
job_idstringJob id returned when the tests started.
wait_secondsintegerSeconds to wait for the run to finish before answering. Defaults to 45s. Pass 0 to check without waiting.
Changes data in qbash, or starts work that does.
Connectors
Find connectors and accounts, look up their SDK operations and add an account to a server.
list_connectorsList connectors and whether each is connected for you. Connected ones come first, with your accounts. Without query or status, connectors you have not connected are listed by id only. Then call describe_mode with a provider for its SDK modes, or request_connector for one that is not connected.
{
"name": "list_connectors",
"arguments": {}
}
include_actionsbooleanInclude each account's action names. Off by default.
querystringConnector or account name to match.
statusstringOnly connectors with this status.
One of
connected,needs_reconnection,not_connected.
Reads only. Clients that ask before calling tools can treat it as safe.
request_connectorAsk the person to connect a connector, such as Reddit, when list_connectors shows it not_connected, or connected but not on this server. Returns a link that opens the connector's connect form in qbash, and the steps to use it from an MCP server in their client. Connector tools do not run on this server until the account is added to it. Only the person can connect it, in qbash, so never ask them for keys or passwords.
{
"name": "request_connector",
"arguments": {
"provider": "<provider>"
}
}
providerstringrequiredConnector provider id or name, as list_connectors returns it, such as reddit.
clientstringThe MCP client you are running in, so the steps fit it. Leave it out only when you cannot tell: the result then says client_needed, and you ask the person.
One of
claude-code,codex,cursor,vscode,claude-ai,chatgpt,grok-bot,other.
Reads only. Clients that ask before calling tools can treat it as safe.
search_sdkSearch SDK documentation for functions and connector operations.
{
"name": "search_sdk",
"arguments": {
"query": "<query>"
}
}
querystringrequiredSDK operation or capability to find.
Reads only. Clients that ask before calling tools can treat it as safe.
describe_modeDescribe connector operations, their arguments and results.
{
"name": "describe_mode",
"arguments": {
"provider": "<provider>"
}
}
providerstringrequiredConnector provider id.
modestringOptional mode id.
Reads only. Clients that ask before calling tools can treat it as safe.
Memories
Find memory folders you can access and read, search or update their contents.
list_memory_foldersList memory folders you can access and whether you can write to them.
{
"name": "list_memory_folders",
"arguments": {}
}
querystringOptional words from the folder name.
Reads only. Clients that ask before calling tools can treat it as safe.
memories_create_folderCreate a memory folder owned by you, private to you until you share it in qbash. It holds documents for keyword search and exact lookups. Searching by meaning is turned on in qbash, not here.
{
"name": "memories_create_folder",
"arguments": {
"name": "<name>"
}
}
namestringrequiredFolder name.
descriptionstringOptional. What the folder is for.
Changes data in qbash, or starts work that does.
memories_getRun qbash.memories.get against a folder.
{
"name": "memories_get",
"arguments": {
"name": "<name>"
}
}
namestringrequiredExact document name.
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
Reads only. Clients that ask before calling tools can treat it as safe.
memories_queryRun qbash.memories.query with exact name and metadata filters.
{
"name": "memories_query",
"arguments": {}
}
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
metadataobjectnamestringOptional exact document name.
Reads only. Clients that ask before calling tools can treat it as safe.
memories_list_allRun qbash.memories.list_all for a folder.
{
"name": "memories_list_all",
"arguments": {}
}
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
Reads only. Clients that ask before calling tools can treat it as safe.
memories_searchRun qbash.memories.search: literal keyword search without embeddings.
{
"name": "memories_search",
"arguments": {
"query": "<query>"
}
}
querystringrequiredText to find.
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
limitintegerMaximum results, from 1 to 100.
Reads only. Clients that ask before calling tools can treat it as safe.
memories_vector_searchRun qbash.memories.vector_search over embedded content.
{
"name": "memories_vector_search",
"arguments": {
"query": "<query>"
}
}
querystringrequiredSemantic query.
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
limitintegerMaximum results.
thresholdnumberMinimum similarity from 0 to 1.
Reads only. Clients that ask before calling tools can treat it as safe.
memories_createCreate a Markdown document in a memory folder you can write to (qbash.memories.store).
{
"name": "memories_create",
"arguments": {
"name": "<name>"
}
}
namestringrequiredDocument name.
contentstringMarkdown body. Pass content or file.
fileobjectAuthorized qbash file reference.
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
metadataobject
Changes data in qbash, or starts work that does.
memories_updateRun qbash.memories.update on an existing document.
{
"name": "memories_update",
"arguments": {
"content": "<content>",
"memory_id": "<memory_id>"
}
}
contentstringrequiredNew content.
memory_idstringrequiredDocument id.
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
mergebooleanmetadataobject
Changes data in qbash, or starts work that does.
memories_archiveRun qbash.memories.archive.
{
"name": "memories_archive",
"arguments": {
"memory_id": "<memory_id>"
}
}
memory_idstringrequiredDocument id.
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
Changes data in qbash, or starts work that does.
memories_unarchiveRun qbash.memories.unarchive.
{
"name": "memories_unarchive",
"arguments": {
"memory_id": "<memory_id>"
}
}
memory_idstringrequiredDocument id.
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
Changes data in qbash, or starts work that does.
memories_get_propositionsRun qbash.memories.get_propositions.
{
"name": "memories_get_propositions",
"arguments": {
"memory_id": "<memory_id>"
}
}
memory_idstringrequiredDocument id.
folderstringExact memory folder name. Pass this or folder_id.
folder_idstringMemory folder UUID. Pass this or folder.
Reads only. Clients that ask before calling tools can treat it as safe.