Runstack Docs

Meta Tools

Full reference for the 4 meta tools exposed by the Runstack MCP server — search_tools, check_authentication, initiate_connection, and execute_tool.

The Runstack MCP server exposes 4 meta tools rather than 150+ individual tools. This approach keeps context lean — the AI uses search_tools to dynamically discover what it needs, then calls execute_tool to run it.

search_tools

Search the Runstack tool registry by regex pattern.

search_tools({
  pattern: string,           // regex to match
  searchIn?: "names" | "descriptions" | "both"  // default: "both"
})

Returns: List of matching tools with names, descriptions, parameter schemas, and requiredAuth field.

Example:

search_tools({ pattern: "github.*issue", searchIn: "both" })

Returns all tools whose name or description mentions github and issue, such as:

  • github_create_issue
  • github_list_repo_issues
  • github_update_issue
  • github_add_issue_comment

Does not count toward your usage limit.


check_authentication

Verify that the current user has connected a provider required by a tool.

check_authentication({
  toolName: string   // exact tool name from search_tools
})

Returns:

// Authenticated
{ "authenticated": true, "toolName": "github_create_issue" }

// Not authenticated
{
  "authenticated": false,
  "toolName": "github_create_issue",
  "requiredAuth": "githubToken",
  "reason": "token_missing"
}

Reasons:

ReasonMeaning
no_auth_requiredTool works without a connection
token_missingProvider not connected in Runstack
user_not_foundAPI key user has no Runstack account

Does not count toward your usage limit.


initiate_connection

Get an OAuth URL the user can open to connect a provider.

initiate_connection({
  provider: string   // "github" | "notion" | "gmail" | "linear" | "google-sheets" | "googlecalendar"
})

Returns:

{
  "link": "https://your-runstack-url.com/auth/provider/github",
  "provider": "github"
}

The user must open this link in their browser, complete the OAuth flow, then retry the tool call. This is not needed if check_authentication returns authenticated: true.

Does not count toward your usage limit.


execute_tool

Execute any registered tool by name with the provided arguments.

execute_tool({
  toolName: string,                     // exact name from search_tools
  args: Record<string, unknown>         // key-value arguments
})

Returns:

// Success
{
  "toolName": "github_create_issue",
  "success": true,
  "result": { "number": 42, "url": "https://github.com/..." }
}

// Failure — invalid arguments
{
  "error": "Invalid arguments for tool",
  "toolName": "github_create_issue",
  "expectedParameters": { "owner": { "type": "string", ... }, ... },
  "providedParameters": ["owner"]
}

// Failure — not connected
{
  "error": "Tool requires connection",
  "toolName": "github_create_issue",
  "requiredAuth": "githubToken",
  "message": "Use initiate_connection(provider) to connect."
}

This counts toward your usage limit.

Auth tokens are injected automatically from the user's stored OAuth connections — you never pass tokens in args.


1. search_tools(pattern)
      ↓ find the right tool name
2. check_authentication(toolName)
      ↓ if not authenticated:
        initiate_connection(provider) → user connects in browser → retry
      ↓ if authenticated:
3. execute_tool(toolName, args)

On this page