workbench Docs

Project

Tool catalog

Every tool a stock install loads — 194 plugin tools across 16 integrations, plus 12 built-in tools.

A stock install registers 206 tools: 194 from the 16 built-in plugins, plus 9 browser tools and 3 jots tools from the two internal plugins.

None of them appear in MCP tools/list — that returns only the nine meta-tools. Find a tool here or with search_tools, fetch its arguments with get_tool_schema, and run it with execute_tools.

IntegrationAuthCurl proxyTools
asanaoauth2yes8
atlassian-bitbucketoauth2yes20
atlassian-confluenceoauth2yes6
atlassian-jiraoauth2yes12
githuboauth2yes28
gitlaboauth2 + instanceyes31
google-calendaroauth2yes7
google-docsoauth2yes5
google-driveoauth2yes8
google-geminioauth2yes1
google-gmailoauth2yes8
google-sheetsoauth2yes5
google-slidesoauth2yes5
httpbin-cookiecookieno3
newrelicapikeyyes13
slackoauth2yes18
browsernone (internal)no9
jotsnone (internal)no3

Tool names are a flat global namespace across every plugin, so a later-loaded plugin silently wins a name collision. Prefix your own tools with your integration name.

asana#

ToolPurpose
asana_create_taskCreate a task in a project; returns its gid
asana_get_taskRead one task by gid
asana_update_taskUpdate fields; completed: true is how you close a task
asana_add_commentAdd a story (comment) to a task
asana_list_tasksSlim task rows for a project
asana_list_projectsSlim project rows
asana_list_teamsSlim team rows for an organization
asana_search_usersResolve user gids for assignment

atlassian-bitbucket#

ToolPurpose
bitbucket_list_reposSlim repo rows for a workspace
bitbucket_get_repoOne repo plus its https clone URL
bitbucket_create_prOpen a PR; upserts an existing PR from the same source branch, and filters the author out of reviewers
bitbucket_list_prsSlim PR rows, OPEN by default
bitbucket_get_prOne PR including reviewer approval status
bitbucket_get_pr_diffDiffstat rows, or the full unified diff
bitbucket_list_pr_commentsPR comments including inline {path, line}
bitbucket_add_pr_commentAdd a general or inline PR comment
bitbucket_approve_prApprove as the connected user
bitbucket_request_changesMark the PR as changes-requested
bitbucket_merge_prMerge into the destination branch — irreversible
bitbucket_decline_prClose the PR without merging
bitbucket_get_fileRaw file text at a ref
bitbucket_list_pr_commitsSlim commit rows for a PR
bitbucket_trigger_pipelineStart a Pipelines run on a branch
bitbucket_get_pipelinePoll one pipeline run
bitbucket_stop_pipelineStop a running pipeline
bitbucket_get_clone_urlMint a token-embedded clone URL
bitbucket_list_default_reviewersReviewers that auto-attach to new PRs
bitbucket_search_usersResolve user UUIDs

atlassian-confluence#

ToolPurpose
confluence_create_pageCreate a page in a space
confluence_search_pagesCQL full-text search
confluence_get_pagePage body, version, space, and attachments
confluence_list_spacesList spaces
confluence_update_pageUpdate a page — takes the current version number
confluence_delete_pageMove a page to the space trash

atlassian-jira#

ToolPurpose
jira_create_issueCreate an issue
jira_search_issuesJQL search; slim rows plus a page token
jira_get_issueOne issue in full
jira_search_usersResolve account IDs
jira_get_boardsList Agile boards
jira_project_typesProject types, with base64 icons stripped
jira_update_issueUpdate issue fields
jira_get_transitionsTransitions available from the current status
jira_transition_issueMove an issue to a new status
jira_add_commentComment on an issue
jira_get_commentsComments, converted from ADF to plain text
jira_list_projectsList projects

github#

ToolPurpose
github_list_reposList repositories
github_get_repoOne repository
github_list_branchesList branches
github_list_commitsList commits
github_list_releasesList releases
github_get_contentFile contents (base64 + sha) or a directory listing
github_create_issueCreate an issue
github_list_issuesList issues
github_get_issueOne issue
github_update_issueUpdate an issue
github_add_issue_commentComment on an issue
github_create_prOpen a pull request
github_list_prsList pull requests
github_get_prOne pull request
github_get_pr_diffThe PR diff
github_list_pr_commentsPR review comments
github_add_pr_commentComment on a PR
github_merge_prMerge a PR
github_create_pr_reviewSubmit a review — APPROVE, REQUEST_CHANGES, or COMMENT
github_create_or_update_fileCommit a file directly
github_search_codeCode search
github_search_issuesIssue and PR search
github_list_workflow_runsList Actions runs
github_trigger_workflowworkflow_dispatch a workflow
github_get_workflow_runPoll one run
github_rerun_workflow_runRe-run a workflow run
github_cancel_workflow_runCancel a running workflow
github_get_clone_urlMint a token-embedded clone URL
`github_trigger_workflow` returns no run id

workflow_dispatch answers 204 with no body. The workflow must declare on: workflow_dispatch, and you have to poll github_list_workflow_runs to find the run you started.

gitlab#

Every GitLab tool builds its base URL from the connection's instanceUrl, defaulting to https://gitlab.com — the same tools work against a self-hosted instance.

ToolPurpose
gitlab_list_projectsList projects
gitlab_get_projectOne project
gitlab_list_branchesList branches
gitlab_list_commitsList commits
gitlab_list_releasesList releases
gitlab_get_fileRead a file at a ref
gitlab_create_or_update_fileCommit a file directly
gitlab_create_issueCreate an issue
gitlab_list_issuesList issues
gitlab_get_issueOne issue
gitlab_update_issueUpdate an issue
gitlab_add_issue_commentComment on an issue
gitlab_create_mrOpen a merge request
gitlab_list_mrsList merge requests
gitlab_get_mrOne merge request
gitlab_get_mr_diffThe MR diff
gitlab_list_mr_commitsCommits in an MR
gitlab_list_mr_commentsMR notes
gitlab_add_mr_commentComment on an MR
gitlab_approve_mrApprove an MR
gitlab_merge_mrMerge an MR
gitlab_close_mrClose an MR without merging
gitlab_list_pipelinesList pipelines
gitlab_trigger_pipelineStart a pipeline; variables is [{key, value}]
gitlab_get_pipelinePoll one pipeline
gitlab_retry_pipelineRetry failed jobs
gitlab_cancel_pipelineCancel a running pipeline
gitlab_search_projectsProject search
gitlab_search_codeCode search
gitlab_search_issuesIssue search
gitlab_get_clone_urlMint a token-embedded clone URL

google-calendar#

ToolPurpose
google_calendar_list_eventsList events in a time range
google_calendar_create_eventCreate an event
google_calendar_get_eventOne event
google_calendar_update_eventPatch an event
google_calendar_delete_eventDelete an event
google_calendar_list_calendarsList the user's calendars
google_calendar_freebusyFree/busy query across calendars

google-docs#

ToolPurpose
google_docs_getFull document structure
google_docs_get_plaintextDocument text only
google_docs_createCreate a document
google_docs_batch_updateApply a batch of document edits
google_docs_searchFind documents via Drive

google-drive#

ToolPurpose
google_drive_listList files with a raw Drive q query
google_drive_create_folderCreate a folder
google_drive_searchName and full-text search, query escaped
google_drive_uploadUpload file content
google_drive_upload_from_urlFetch a URL into Drive
google_drive_downloadDownload file content
google_drive_trashMove a file to trash
google_drive_permissionsUpdate sharing permissions for a file
`google_drive_upload_from_url` blocks private addresses by hostname

It requires https and rejects localhost, 127.*, 10.*, 172.16–31.*, 192.168.*, 169.254.*, 0.0.0.0, and IPv6 loopback/ULA/link-local. This is a string check on the hostname, so a public DNS name resolving to a private address is not caught.

google-gemini#

ToolPurpose
google_gemini_generateGenerate content with a Gemini model

google-gmail#

ToolPurpose
google_gmail_sendSend a message, or reply inside a thread
google_gmail_listList messages
google_gmail_getOne message, body decoded, with its messageIdHeader
google_gmail_modifyChange labels — mark read, archive
google_gmail_profileThe mailbox profile
google_gmail_labelsList labels
google_gmail_threadsList conversation threads
google_gmail_draftCreate a draft

google-sheets#

ToolPurpose
google_sheets_readRead a range
google_sheets_writeOverwrite a range
google_sheets_appendAppend rows
google_sheets_createCreate a spreadsheet
google_sheets_searchFind spreadsheets

google-slides#

ToolPurpose
google_slides_getRead a presentation
google_slides_createCreate a presentation
google_slides_batch_updateApply a batch of slide edits
google_slides_searchFind presentations
google_slides_create_from_markdownBuild slides from Markdown — --- splits slides, ||| makes two columns

The reference cookie-auth plugin. It exists to exercise the browser-session capture path end to end, and ships no logo on purpose so the portal's fallback icon gets used.

ToolPurpose
httpbin_get_cookiesRead back the cookies the proxy sent
httpbin_set_cookieSet a cookie on httpbin
httpbin_get_headersEcho request headers — verifies Cookie injection

newrelic#

All thirteen go through NerdGraph. The endpoint is region-scoped from the connection's stored region.

ToolPurpose
newrelic_run_nrqlRun an NRQL query
newrelic_search_entitiesEntity search
newrelic_get_dashboardRead a dashboard
newrelic_create_alert_policyCreate an alert policy
newrelic_create_static_nrql_conditionAdd a static NRQL alert condition
newrelic_create_alert_notification_channelCreate a legacy notification channel
newrelic_add_notification_channels_to_policyAttach legacy channels to a policy
newrelic_create_ai_notifications_destinationCreate a notification destination
newrelic_create_ai_notifications_channelCreate a notification channel
newrelic_create_ai_workflowCreate a workflow linking a policy to channels
newrelic_add_tags_to_entityTag an entity
newrelic_add_widgets_to_dashboard_pageAdd widgets to a dashboard page
newrelic_configure_cloud_integrationConfigure a cloud integration

The two legacy alert-channel mutations are best-effort and were never verified against a live account.

slack#

Slack's scopes are user scopes, so these tools act as the connecting user, not as a bot.

ToolPurpose
slack_send_messagePost a message to a channel
slack_update_messageEdit a message
slack_delete_messageDelete a message — destructive
slack_list_channelsList channels
slack_get_channel_historyRead channel history
slack_upload_fileUpload a file
slack_add_reactionAdd an emoji reaction
slack_get_thread_repliesRead a thread
slack_lookup_userLook up a user by exact email
slack_send_dmSend a direct message
slack_search_allSearch messages and files
slack_list_usersList workspace users
slack_download_fileDownload a Slack-hosted file
slack_get_file_infoFile metadata
slack_remove_reactionRemove a reaction
slack_get_permalinkPermalink for a message
slack_join_channelJoin a public channel
slack_find_usersFuzzy user search

slack_download_file needs the files:read scope. It validates the host before sending the credential and drops the Bearer the moment a redirect leaves Slack, so the token cannot be redirected out.

browser (internal)#

Nine tools driving one warm, per-user Chromium session. Always connected — this is an auth: none integration. Every action tool ensures the session exists and marks it active, so an idle session is reaped but a working one is not.

ToolPurpose
browser_navigateNavigate the session. http/https only
browser_screenshotDownscaled JPEG of the viewport; returns { unchanged: true } when pixels are identical to the last shot
browser_clickClick at coordinates — left, right, or middle
browser_typeType into the focused element
browser_keyPress a key or chord
browser_scrollScroll a direction, 600px by default
browser_read_textdocument.body.innerText, optionally truncated
browser_closeClose the session, keep the profile
browser_live_urlMint a link that hands the live browser to a human

browser_screenshot defaults to a maximum width of 1000 pixels and clamps quality to 1–100. browser_live_url returns a portal URL carrying a signed connect token, valid for CONNECT_TTL_SECONDS (600 by default).

browser_close ends the warm session and keeps the profile. There is one Chromium per user, shared with cookie capture rather than exclusive with it.

jots (internal)#

Five tools for hosting static files. Also auth: none.

ToolPurpose
deploy_jotReturns { uploadUrl, token, expiresAt, maxBytes } for a gzip-tarball upload that replaces the jot
update_jotSame, in patch mode: the archive is overlaid onto the live jot, plus an optional delete list. access / password / cors are applied to the live jot immediately, no upload needed
list_jot_filesList a jot's files — path, bytes, updatedAt
list_jotsList the caller's own jots — never anyone else's
delete_jotDelete a jot you own

deploy_jot rejects an invalid name (INVALID_NAME), access: "password" without a password (PASSWORD_REQUIRED), and a name already owned by another user (JOT_NAME_TAKEN — names are global and creator-locked). Passwords are hashed before the token is minted. update_jot, list_jot_files, and delete_jot return FORBIDDEN for another owner's jot and NOT_FOUND when it does not exist. update_jot also rejects a delete entry that escapes the jot or names the manifest (INVALID_PATH).

A patch upload inherits access and the password hash from the live jot, so the archive cannot change gating, and it needs no root index.html — the live one is retained.

Gating is changed through update_jot's own arguments instead. access (public / password), password, and cors are written to the manifest when the tool is called, not when an archive lands, and come back in the result as applied: { access, cors }. password alone implies access: "password"; an empty password is PASSWORD_REQUIRED, as is switching to password on a jot with no stored hash; restating access: "password" without a new password keeps the current one; going public drops the hash. Any change to the hash invalidates the unlock cookies already issued for that jot. Omitted settings are inherited from the live manifest.

Both tools accept cors: true, which on a public jot serves its files with Access-Control-Allow-Origin: * so the page can fetch its own data. The sandbox CSP is unchanged. The flag is ignored on password jots. On update_jot, cors: false turns it back off.

Limits come from configuration: JOTS_MAX_BYTES (5 MiB), JOTS_MAX_FILES (1000), and JOTS_UPLOAD_TTL_SECONDS (300, single use). An archive with no root index.html is rejected with NO_INDEX. A patch is re-measured after the merge, so one that pushes the tree over either cap is rejected with TOO_LARGE / TOO_MANY_FILES.