Add connected MCP server tools to your agents so they can interact with external services.
Adding via the UI
- Open your agent's settings → Tools tab
- Click Add Tool → Connector Tool
- Select a connected MCP server
- Choose which tools to expose to the agent
The agent sees each tool with its name, description, and input schema — just like any other tool.
Adding via YAML
In your agent's YAML config, add tools with type: mcp:
1tools:2 - name: list_issues3 type: mcp4 description: List Linear issues with filtering5 mcp:6 integration_id: "integ_abc123"7 tool_name: "list_issues"89 - name: create_issue10 type: mcp11 description: Create a new Linear issue12 require_approval: true13 mcp:14 integration_id: "integ_abc123"15 tool_name: "create_issue"| Field | Description |
|---|---|
integration_id | Your team's integration ID for the MCP server |
tool_name | The tool name as listed by belt mcp tools <slug> |
Finding Your Integration ID
After connecting to a server (belt mcp connect), find the integration ID:
1belt integrations list2belt integrations get mcp:mcp.linear.app --json # id field in JSON outputOr via the web UI under team settings → integrations.
belt app integrations list lists app capability keys for inf.yml (for example google.sheets) — not team connection IDs. Use belt integrations list for connected services.
Tool Schema and Description
When an agent loads a connector tool, the runtime resolves the name, description, and input schema the LLM sees:
| Step | Source | When it applies |
|---|---|---|
| 1. Cached schema | Integration metadata from connect time | Default — populated when you connect via belt mcp connect, the workspace, or POST /integrations |
| 2. Live fetch | MCP server tools/list | Cache is missing or the tool was added after connect |
| 3. Generic fallback | Single arguments object | Cache and live fetch both fail (unreachable server, legacy integration without a server URL) |
Description — The description on your agent tool overrides the MCP server's tool description. If you omit it, the runtime uses the server's description from the cached or live tool definition.
JSON Schema dialect
MCP tool inputSchema values are JSON Schema documents. Per the MCP specification (rev 2025-11-25, SEP-1613), schemas that omit "$schema" default to JSON Schema 2020-12. When a tool declares an explicit "$schema" (for example draft-07), inference shell parses the schema under that dialect.
When converting MCP schemas to the typed parameters agents and belt mcp tools display, the platform resolves array items across dialects — including 2020-12 single-schema arrays and draft-07 tuple forms.
Troubleshooting
If an agent tool shows a generic arguments parameter instead of typed fields, or array parameters look like untyped object[] instead of the element type the MCP server defines, reconnect the MCP integration (belt mcp connect <slug>) so the platform can refresh cached tool schemas.
How It Works at Runtime
- Agent decides to call the tool based on the conversation
- Runtime loads your team's integration credentials
- Opens a fresh MCP session to the remote server
- Calls the tool with the agent's arguments
- Returns the result to the agent
Credentials are never exposed to the agent. Each tool call gets a fresh session — no state leaks between calls.
Require Approval
For destructive operations (creating issues, sending messages, deleting records), enable require_approval:
1- name: send_slack_message2 type: mcp3 description: Send a message to a Slack channel4 require_approval: true5 mcp:6 integration_id: "integ_xyz789"7 tool_name: "send_message"The agent pauses and waits for user confirmation before executing.
Example: Triage Agent
An agent that reads Linear issues and posts summaries to Slack:
1name: triage-agent2description: Summarizes new Linear issues and posts to Slack3core_app:4 ref: openrouter/claude-sonnet-455system_prompt: |-6 You triage incoming Linear issues. For each new issue:7 1. Read the issue details8 2. Categorize by severity and area9 3. Post a summary to the #triage Slack channel10tools:11 - name: list_issues12 type: mcp13 description: List recent Linear issues14 mcp:15 integration_id: "integ_linear"16 tool_name: "list_issues"1718 - name: get_issue19 type: mcp20 description: Get full issue details21 mcp:22 integration_id: "integ_linear"23 tool_name: "get_issue"2425 - name: post_to_slack26 type: mcp27 description: Post a message to Slack28 require_approval: true29 mcp:30 integration_id: "integ_slack"31 tool_name: "send_message"SDK Builders
Python
1from inferencesh import mcp_tool23list_issues = (4 mcp_tool("list_issues", "integ_abc123", "list_issues")5 .describe("List Linear issues with filtering")6 .build()7)89create_issue = (10 mcp_tool("create_issue", "integ_abc123", "create_issue")11 .describe("Create a new Linear issue")12 .require_approval()13 .build()14)JavaScript
1import { mcpTool } from '@inferencesh/sdk';23const listIssues = mcpTool('list_issues', 'integ_abc123', 'list_issues')4 .describe('List Linear issues with filtering')5 .build();67const createIssue = mcpTool('create_issue', 'integ_abc123', 'create_issue')8 .describe('Create a new Linear issue')9 .requireApproval()10 .build();Next
- MCP Server — use inference shell as an MCP server for Claude Code and Cursor
- Adding Tools — all agent tool types