MCP connector
MCP (Model Context Protocol) is an open standard for tool servers. With the MCP connector you list remote MCP servers in your request; Syntic connects to them, shows their tools to the model, runs the calls the model makes and returns the final answer. You do not write any client code for MCP.
When to use it
- You (or a vendor) already run an MCP server for a CRM, ticketing system, database or internal API.
- You want the same tools available in Syntic Code, your own apps and the API without rewriting them as functions.
For tools that run inside your own application, ordinary function tools are simpler.
Endpoint and auth
POST https://app.syntic.ai/v1/chat/completions (and Messages), Authorization: Bearer sk_live_....
Request field
mcp_servers is an array of up to 10 servers:
| Field | Type | Required | Details |
|---|---|---|---|
name | string | Yes | Your label, 1 to 32 characters, unique in the request. Tools are shown to the model as name.tool_name. |
url | string | Yes | Public https address of a server using the streamable HTTP transport. |
authorization_token | string | No | Sent as Authorization: Bearer ... to the server. Never stored or logged. |
vault_secret | string | No | Instead of a raw token, the name of a secret in a credential vault. |
allowed_tools | array of strings | No | Only these tools are offered. Default: all the server lists. |
require_approval | string or array | No | "never" (default), "always", or a list of tool names that need approval. |
timeout_seconds | integer | No | Per call, 1 to 120. Default 30. |
How it works
- Syntic connects to each server and lists its tools (cached for 5 minutes per server and token).
- The model sees those tools next to any function tools you sent.
- When the model calls an MCP tool, Syntic runs it and feeds the result back, repeating until the model answers.
- Calls that need approval stop the loop and are returned to you (see below).
Response
{
"message": {
"role": "assistant",
"content": "Ticket SUP-4412 is assigned to Priya and due Friday.",
"server_tool_calls": [
{ "id": "srv_04", "type": "mcp", "server": "helpdesk", "tool": "get_ticket", "status": "ok", "duration_ms": 412 }
]
},
"usage": { "prompt_tokens": 2980, "completion_tokens": 22, "total_tokens": 3002, "server_tool_use": { "mcp_calls": 1 } }
}Approval
When a call needs approval, the reply ends with finish_reason: "tool_calls" and the call appears in tool_calls with type: "mcp_approval":
{ "id": "call_k2", "type": "mcp_approval", "mcp_approval": { "server": "helpdesk", "tool": "close_ticket", "arguments": "{\"id\":\"SUP-4412\"}" } }Send back a tool message with "content": "{\"approve\": true}" (or false with a reason) and the same mcp_servers; Syntic runs the call if approved and continues.
Examples
curl https://app.syntic.ai/v1/chat/completions \
-H "Authorization: Bearer $SYNTIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Amara S1.2",
"stream": false,
"mcp_servers": [{
"name": "helpdesk",
"url": "https://mcp.helpdesk.example.com/mcp",
"vault_secret": "helpdesk-token",
"allowed_tools": ["get_ticket", "search_tickets", "close_ticket"],
"require_approval": ["close_ticket"]
}],
"messages": [{ "role": "user", "content": "Who owns SUP-4412 and when is it due?" }]
}'Errors
Unified envelope. Errors from a tool call are passed to the model as the tool result; errors reaching the server fail the request.
| Status | code | param | Cause |
|---|---|---|---|
| 400 | invalid_mcp_server | mcp_servers[i] | Missing field, bad name, or non-https URL. |
| 400 | mcp_url_blocked | mcp_servers[i].url | Private or internal address. |
| 400 | too_many_mcp_servers | mcp_servers | More than 10. |
| 404 | vault_secret_not_found | mcp_servers[i].vault_secret | No such secret in your workspace. |
| 424 | mcp_server_unreachable | mcp_servers[i] | Could not connect or list tools. message says why (timeout, TLS, HTTP status). |
| 424 | mcp_auth_failed | mcp_servers[i] | The server rejected the token. |
| 400 | streaming_not_allowed | stream | Not available in batches. |
Limits and pricing
| Servers per request | 10 |
| Tools per server offered to the model | 100 (use allowed_tools or tool search for more) |
| Calls per request | 50 |
| Tool result size | 100,000 tokens, truncated beyond that |
| Price | No connector fee. Tool definitions and results are normal input tokens. |
Security
- Syntic connects from published egress addresses so you can allowlist them.
- Tokens live only in memory, and only while the request runs. Use vaults to avoid sending them at all.
- Tool results can contain instructions written by third parties. Use
allowed_toolsand approval for anything that changes data.
Build notes for the platform team
- Act as an MCP client over streamable HTTP inside the gateway’s server-tool loop; reuse the shared outbound URL checks.
- Per-org concurrency cap and per-call timeout; never log
authorization_token. - Later: private network tunnels for servers behind a firewall.