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"]},
)
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 Connect an MCP client for setup details and Generate user MCP URLs to get the URL.