Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Anthropic

Build an Anthropic agent with Scalekit-authenticated tools. Scalekit returns tool schemas in Anthropic's native format; no conversion needed.

Build an agent using Anthropic’s Claude that reads a user’s Gmail inbox. Scalekit returns tool schemas with input_schema, the exact format Anthropic’s tool use API expects.

Terminal window
pip install scalekit-sdk-python anthropic
import os
import scalekit.client
import anthropic
from google.protobuf.json_format import MessageToDict
scalekit_client = scalekit.client.ScalekitClient(
client_id=os.getenv("SCALEKIT_CLIENT_ID"),
client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
env_url=os.getenv("SCALEKIT_ENV_URL"),
)
actions = scalekit_client.actions
client = anthropic.Anthropic()
response = actions.get_or_create_connected_account(
connection_name="gmail",
identifier="user_123",
)
if response.connected_account.status != "ACTIVE":
link = actions.get_authorization_link(connection_name="gmail", identifier="user_123")
print("Authorize Gmail:", link.link)
input("Press Enter after authorizing...")

See Authorize a user for production auth handling.

Fetch tools scoped to this user, then run the full Claude tool-use loop:

# Fetch tools scoped to this user
scoped_response, _ = actions.tools.list_scoped_tools(
identifier="user_123",
filter={"connection_names": ["gmail"]},
page_size=100, # fetch beyond the default page so no connector tools are missed
)
llm_tools = [
{
"name": MessageToDict(t.tool).get("definition", {}).get("name"),
"description": MessageToDict(t.tool).get("definition", {}).get("description", ""),
"input_schema": MessageToDict(t.tool).get("definition", {}).get("input_schema", {}),
}
for t in scoped_response.tools
]
# Run the agent loop
messages = [{"role": "user", "content": "Fetch my last 5 unread emails and summarize them"}]
while True:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=llm_tools,
messages=messages,
)
if response.stop_reason == "end_turn":
print(response.content[0].text)
break
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = actions.execute_tool(
tool_name=block.name,
identifier="user_123",
tool_input=block.input,
)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": str(result.data),
})
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": tool_results})

Claude Desktop and other Anthropic-compatible MCP hosts connect directly to Scalekit MCP URLs. Add the URL to your MCP host config:

{
"mcpServers": {
"scalekit": {
"transport": "streamable-http",
"url": "your-scalekit-mcp-url"
}
}
}

For programmatic use, connect via any MCP client library and pass tools to anthropic.messages.create. See Virtual MCP Servers for setup details and the URL.