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_issuegithub_list_repo_issuesgithub_update_issuegithub_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:
| Reason | Meaning |
|---|---|
no_auth_required | Tool works without a connection |
token_missing | Provider not connected in Runstack |
user_not_found | API 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://app.runstack.engineer/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.
Recommended workflow
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)