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://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.
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)stdio MCP Server
Build a local stdio MCP server that runs as a subprocess. Best for local tooling, CLI scripts, and desktop clients like Claude Desktop.
Runstack Studio
Build, configure, and publish AI agents in Runstack Studio. Invoke any published agent instantly in chat using the /agentName slash command.