Using the Agent Framework
context.tools provides a tool inventory view for LLMs. It has been adapted for the framework, so business code does not require additional format conversion.List of Built-in Platform Tools
Tools are atomized by capability, with each tool mapped one-to-one to an underlying sandbox method. The LLM selects tools through semantic matching of tool names + descriptions, and the business logic can also configure the allowed invocation scope at a fine-grained level based on tool names.
Tool Name | Input Parameter | Description |
commands | cmd, cwd?, env?, timeout? | Execute one-time shell commands. |
files_read | path | Reading files. |
files_write | path, content | Writing files (creates if not exist, overwrites if exist). |
files_list | path | Lists directory contents, with entries containing only name / type / path. |
files_exists | path | Checks whether a file or directory exists. |
files_remove | path | Deleting files or directories. |
files_make_dir | path | Creating directories |
browser_fetch | url | Navigates to a page using a real Chromium browser and obtains the page metadata and HTML. |
browser_screenshot | url?, fullPage? | Takes a screenshot and returns { base64Image }. |
browser_click | selector | Clicks an element on the current page. |
browser_type | selector, text | Enters text into an element on the current page. |
browser_evaluate | script | Executes JavaScript in the context of the current page. |
code_interpreter | language, code, timeout? | Executing code |
web_search | query, maxResults?, site? | Performs lightweight web searches and returns title / href / snippet/ snite/ date. |
Quick Method for Tool Selection
context.tools provides the following selection methods. Their return values are tool object arrays or a single tool object adapted for the current framework:Methodology | Return Value | Scenarios |
all() | All built-in tools | Allows the model to use full sandbox capabilities. |
get(name) | A single tool with a specified name | Precisely sign up for or manually call a specific atomic tool |
files() | files_read,files_write,files_list,files_exists,files_remove,files_make_dir | Quickly sign up for file capabilities |
browser() | browser_fetch,browser_screenshot,browser_click,browser_type,browser_evaluate | Quickly sign up for browser capabilities |
Example: Grant only file and browser capabilities to the Agent, without exposing shell commands or the code interpreter:
const safeTools = [...context.tools.files(),...context.tools.browser(),]
To further disable write or delete capabilities, you can continue filtering on the grouped results:
const readonlyFileTools = context.tools.files().filter((tool) => !['files_write', 'files_remove', 'files_make_dir'].includes(tool.name))
Supported Frameworks
The output format of
context.tools.* is determined by the framework and configured in edgeone.json:{"agents": { "framework": "claude-agent-sdk" } // claude-agent-sdk / openai-agents-sdk / langgraph / crewai / deepagents}
framework | Output Format |
claude-agent-sdk | { name, description, input_schema, execute } (includes the toClaudeMcpServer() helper) |
openai-agents-sdk | Node: lightweight function-tool compatible object; Python: agents.FunctionTool |
langgraph | Node:lightweight wrapper;Python:LangChain StructuredTool |
deepagents | Node:lightweight LangChain-like wrapper;Python:LangChain StructuredTool |
crewai | Node:lightweight wrapper;Python:CrewAI BaseTool |
The platform does not installlangchain-core/@langchain/core/toolsby default. When you need a real framework tool object, prefer using the helper method below to inject the framework class / factory.
Framework helper Methods
These helpers can be called directly on the
context.tools injected by the Makers Agent Runtime.Framework | Node | Python | Description |
LangGraph / DeepAgents / LangChain | context.tools.toLangChainTools(toolFactory, names?) | ctx.tools.to_langchain_tools(StructuredTool, names=None) | Returns LangChain-compatible tools. The names parameter can be passed a tool name or an array of tool names. |
OpenAI Agents SDK | - | - | No helper method required. |
CrewAI | context.tools.toCrewAITools(baseToolOrFactory, names?) | ctx.tools.to_crewai_tools(BaseTool, names=None) | Returns CrewAI-compatible tools. Supports passing a BaseTool class or a compatible factory. |
Claude Agent SDK | context.tools.toClaudeMcpServer(name?, options?) | ctx.tools.to_claude_mcp_server(name=None, options=None) | Returns an MCP bundle. The name / tools / allowedTools parameters are supported. |
Claude Agent SDK-toClaudeMcpServer
Convert the sandbox built-in tools into an MCP server bundle for the Claude Agent SDK. Then, pass the business code to
createSdkMcpServer / create_sdk_mcp_server to complete the registration.Parameter
Parameter | Description |
name | The MCP server name is synchronized as the mcp__<name>__<tool> prefix. |
options.alwaysLoad / options.always_load | By default, anthropic/alwaysLoad is marked. If { alwaysLoad: false } is passed, anthropic/alwaysLoad metadata is not written. |
Return Value
Returns an MCP bundle object.
TS Example
import { createSdkMcpServer } from '@anthropic-ai/claude-agent-sdk'export async function onRequest(context: any) {const edgeoneMcp = context.tools.toClaudeMcpServer()// Custom server nameconst customMcp = context.tools.toClaudeMcpServer('sandbox')const mcpServers = [createSdkMcpServer({name: edgeoneMcp.name,tools: edgeoneMcp.tools,}),]const allowedTools = edgeoneMcp.allowedTools// Pass mcpServers / allowedTools to the Claude Agent SDK}
Python Example
from claude_agent_sdk import create_sdk_mcp_serverasync def handler(ctx):edgeone_mcp = ctx.tools.to_claude_mcp_server()# Custom server name# custom_mcp = ctx.tools.to_claude_mcp_server('sandbox')mcp_servers = [create_sdk_mcp_server(name=edgeone_mcp.name,tools=edgeone_mcp.tools,)]allowed_tools = edgeone_mcp.allowed_tools# Pass mcp_servers / allowed_tools to the Claude Agent SDK
OpenAI Agents SDK
No helper is needed. Simply pass
context.tools.all() to the OpenAI Agents SDK. To expose only a subset of tools, assemble them using context.tools.files() / context.tools.browser() / context.tools.get(name). The output format remains consistent.TS Example
import { Agent } from '@openai/agents'const agent = new Agent({name: 'Assistant',instructions: 'Use sandbox tools.',tools: context.tools.all(),model,})
Python Example
from agents import Agent, Runneragent = Agent(name="Assistant",instructions="Use sandbox tools.",tools=context.tools.all(),)
LangGraph-toLangChainTools
toLangChainTools / to_langchain_tools accepts the framework's own tool factory and returns a real LangChain tool object.Parameter
Parameter | Description |
toolFactory / StructuredTool | LangChain tool function (Node) or StructuredTool class (Python) imported by the template itself |
names | Tool Name |
Return Value
A LangChain-compatible tool array (in Python, it's a
StructuredTool instance; in Node, it's the result of a tool(...) factory call).TS Example
import { tool } from '@langchain/core/tools'import { createReactAgent } from '@langchain/langgraph/prebuilt'const allTools = context.tools.toLangChainTools(tool)const agent = createReactAgent({ llm: model, tools: allTools })
Python Example
# requirements.txt: pages-agent-toolkit, langchain-core, langgraphfrom langchain_core.tools import StructuredToolfrom langgraph.prebuilt import create_react_agentall_tools = ctx.tools.to_langchain_tools(StructuredTool)agent = create_react_agent(model, tools=all_tools)
DeepAgents-toLangChainTools
DeepAgents is built on LangGraph. Its tool format is the same as LangChain's, so you can simply reuse
toLangChainTools / to_langchain_tools. The helper parameters and return values are consistent with those in LangGraph. The only difference is the agent construction entry point.Parameter
Same as LangGraph: Pass in a LangChain
tool factory (Node) or a StructuredTool class (Python). Optionally, you can also pass names.Return Value
A LangChain-compatible tool array can be directly passed as an input parameter to
create_deep_agent(tools=...) / createDeepAgent({ tools, ... }).TS Example
import { createDeepAgent } from 'deepagents'import { tool } from '@langchain/core/tools'const tools = context.tools.toLangChainTools(tool, ['web_search'])const agent = await createDeepAgent({model,tools,systemPrompt: 'Use web_search for public web discovery.',})
Python Example
from deepagents import create_deep_agentfrom langchain_core.tools import StructuredTooltools = ctx.tools.to_langchain_tools(StructuredTool, names=['web_search'])agent = create_deep_agent(tools=tools,system_prompt='Use web_search for public web discovery.',)
CrewAI-toCrewAITools
toCrewAITools / to_crewai_tools accepts the framework's BaseTool class (or a compatible factory) and wraps the sandbox's built-in tools into CrewAI tool instances.Parameter
Parameter | Description |
baseToolOrFactory / BaseTool | A CrewAI BaseTool class or a factory that returns a BaseTool instance. |
names | Tool Name |
Return Value
A CrewAI-compatible tool array (in Python, it's an instance of a
BaseTool subclass; in Node, it's a compatible object).TS Example
const allTools = context.tools.toCrewAITools(CrewBaseToolOrFactory)const researcher = new Agent({role: 'Researcher',goal: 'Use sandbox tools to gather information.',tools: allTools,})
Python Example
from crewai import Agentfrom crewai.tools import BaseToolall_tools = ctx.tools.to_crewai_tools(BaseTool)researcher = Agent(role='Researcher',goal='Use sandbox tools to gather information.',tools=all_tools,)
Local Debug Logs
Debug logs are disabled by default. When enabled, they output sandbox instance acquisition success events and sandbox tool execution logs to the local CLI's stderr.
To enable it: Add
MAKERS_AGENT_TOOLKIT_DEBUG=1 to the runtime environment variables.MAKERS_AGENT_TOOLKIT_DEBUG=1
Logs mask sensitive fields (
token / auth / password / secret / key). Screenshot results do not print the full base64Image; only a summary is printed:[pages-agent-toolkit] tool.execute.start {"tool":"browser_screenshot","operation":"browser_screenshot","args":{"fullPage":true}}[pages-agent-toolkit] tool.execute.success {"tool":"browser_screenshot","operation":"browser_screenshot","durationMs":123,"result":{"base64ImageLength":193882,"savedToFile":false}}
