Provider-Backed MCP Bindings
Use this guide when you want one handle to expose MCP tools backed by an external HTTPS API. A provider-backed binding is still a 10x function binding, but its runtime target is an external provider endpoint instead of a built-in template or published skill runtime.
This is the right pattern when you already have a stable HTTPS API and you want 10x hosted MCP to surface it as one or more handle-scoped tools.
If the goal is to install a UI plugin that runs inside the local OpenAnalyst runtime, use Custom OpenAnalyst Plugin Setup instead. Provider-backed bindings expose hosted MCP tools; they do not install local OpenAnalyst plugin apps.
What provider-backed bindings support now
Current provider bindings support:
target.type = "provider"- authenticated MCP only
- sync execution only
https://upstream endpoints only- manually defined
tool.name,description, andinputSchema - operator-defined tool behavior metadata
- provider auth modes
none,bearer_secret_ref, andheader_secret_ref
Current provider bindings do not support:
- public browser or WebMCP discovery through
/_fn/* - async execution
- auto-discovery of upstream MCP tools
- streamable HTTP, SSE, or generic MCP message passthrough
When to use provider vs template vs skill
| Target type | Use it when | Do not use it when |
|---|---|---|
template | You need a platform-owned built-in behavior such as proxying, redirects, webhook forwarding, or form submission | You need a custom external API contract that is not one of the built-in templates |
skill | You want to reuse a published 10x skill/runtime and keep execution inside the platform's skill model | Your capability already exists as a normal HTTPS API and does not need the skill runtime model |
provider | You have an external HTTPS API and want to expose it as hosted MCP tools on one handle | You need 10x to connect directly to an upstream MCP server and import its protocol/catalog |
Source-of-truth contract
Provider-backed bindings are created through:
POST /v2/handles/{handle}/function-bindings
Provider-backed MCP invocation happens through:
POST /v2/public/handles/{handle}/function-bindings/{bindingKey}/invoke
Provider rules in the current implementation:
exposure.authenticatedMcpmust betrueexposure.publicWebmust befalseexecution.modemust be"sync"target.endpointUrlmust behttps://...config.methodmust beGETorPOSTconfig.timeoutMsis clamped to1000..10000config.auth.modecan be:nonebearer_secret_refheader_secret_ref
Request shaping is intentionally narrow:
GETturns the validated MCP payload into query parametersPOSTsends the validated MCP payload as JSON
Response shaping is also narrow:
- JSON responses are returned as JSON in the hosted MCP sync envelope
- non-JSON responses are returned as text in the sync envelope
- upstream
4xxand5xxresponses are still normalized into a sync tool result withok: false
Operator workflow
Prepare the upstream API
Make sure the upstream is reachable at a stable
https://URL and returns synchronous JSON or text responses. If the upstream needs authentication, store that secret as a platform-managed secret and note the secret name you will reference in the binding.Create the provider binding
In
https://app.10x.in, open the handle and go toIntegrations -> MCP & Tools. In theSave Bindingform:- set
Target typetoprovider - enter the provider
Endpoint URL - choose
Provider method - set
Provider timeout (ms) - choose
Provider auth mode - add
Secret nameandHeader namewhen required - set
Tool name, description, and input schema - confirm the behavior hints
The UI forces provider bindings to authenticated MCP only and sync only.
- set
Confirm tool behavior metadata
Provider bindings are exposed to MCP clients using the tool metadata you define locally. In the current UI, switching to
providerresets the default behavior hints to:operationClass = writeopenWorld = trueidempotent = false
If you create bindings through the API instead of the UI, send the equivalent
tool.behaviorobject explicitly.Expose the binding through MCP Builder
In the same
Integrations -> MCP & Toolssurface, useMCP Builderto verify that the binding is visible on the hosted MCP connector for that handle.Connect an MCP client
Connect the handle MCP endpoint such as
https://{handle}.mcp.10x.in/mcpand make sure the client has:mcp.connectbinding.invoke:{bindingKey}for the provider-backed binding you want to call
Invoke the tool
Ask the MCP client to run the tool by the
tool.nameyou configured. The hosted MCP transport validates the input against your declared schema, then invokes the provider endpoint using the configured method and auth mode.
Example binding payload
This example exposes one external flight-search endpoint as the hosted MCP tool search_flights:
{
"bindingKey": "flight_search",
"status": "ACTIVE",
"target": {
"type": "provider",
"endpointUrl": "https://travel-adapter.example.com/search-flights"
},
"exposure": {
"publicWeb": false,
"authenticatedMcp": true
},
"execution": {
"mode": "sync"
},
"tool": {
"name": "search_flights",
"description": "Search flights for one departure date with optional filters.",
"behavior": {
"operationClass": "write",
"mutatesState": true,
"openWorld": true,
"idempotent": false,
"sensitivity": "standard"
}
},
"inputSchema": {
"type": "object",
"properties": {
"origin": { "type": "string" },
"destination": { "type": "string" },
"departure_date": { "type": "string" },
"return_date": { "type": "string" },
"cabin_class": { "type": "string" },
"max_stops": { "type": "string" },
"departure_window": { "type": "string" },
"airlines": {
"type": "array",
"items": { "type": "string" }
},
"sort_by": { "type": "string" },
"passengers": { "type": "integer" }
},
"required": ["origin", "destination", "departure_date"]
},
"config": {
"method": "POST",
"timeoutMs": 8000,
"auth": {
"mode": "bearer_secret_ref",
"secretName": "/10x-dot-in/prod/providers/fli/api-token"
}
}
}
Fli example: the supported pattern today
Fli is a Python flight-search package that also exposes:
fli-mcpfor STDIO MCPfli-mcp-httpfor HTTP MCP
Fli's MCP tool surface is:
search_flightssearch_dates
The important boundary is that 10x provider bindings do not consume upstream MCP discovery or message transport directly. Pointing a provider binding at fli-mcp-http does not make 10x import Fli's tools automatically.
Recommended Fli pattern in 10x today
Host a thin HTTPS JSON adapter in front of Fli, then expose that adapter through two provider-backed bindings.
Recommended adapter routes:
POST /search-flightsPOST /search-dates
Recommended local 10x bindings:
| 10x bindingKey | Exposed tool name | Upstream adapter endpoint |
|---|---|---|
flight_search | search_flights | POST https://travel-adapter.example.com/search-flights |
flight_date_search | search_dates | POST https://travel-adapter.example.com/search-dates |
Minimum adapter requirements:
- reachable at a stable
https://URL - synchronous JSON request and response behavior
- request schema aligned to the local binding
inputSchema - response body shaped for the MCP client you expect to use
- optional auth that can be expressed as
bearer_secret_reforheader_secret_ref
Example adapter request shape
For search_flights, the adapter can accept the same object that the binding schema exposes:
{
"origin": "JFK",
"destination": "LHR",
"departure_date": "2026-10-25",
"cabin_class": "BUSINESS",
"max_stops": "NON_STOP",
"sort_by": "CHEAPEST",
"passengers": 1
}
The adapter is responsible for translating that JSON into the real Fli call and returning a stable response. 10x does not transform provider bindings into upstream MCP requests.
When not to use provider for Fli
If the goal is to use Fli as a native MCP server directly, connect fli-mcp or fli-mcp-http to the MCP client instead of routing it through 10x provider bindings. That path keeps the MCP transport native to Fli and avoids building an HTTP adapter.
Pairing with Context Store
Provider-backed bindings and Context Store solve different parts of a connector workflow:
| Need | Use |
|---|---|
| Search a cached corpus of pages, docs, code, or exported records | Context Store |
| Call a live external HTTPS API | Provider-backed function binding |
| Write to the external system | Provider-backed function binding |
| Refresh replicated context after an event | Webhook receiver or automation calling Context Store sync |
Do not put provider credentials or arbitrary provider secret names into Context Store source config. Keep those credentials in provider/function-binding auth, then let agents choose the execution path:
context_store_searchwhen source/entity status isREADYorPREVIEW- provider-backed binding invocation for writes, missing entities, or real-time reads
See Context Store Connectors for source setup examples.
Troubleshooting
| Problem | Likely cause | What to do |
|---|---|---|
| The binding cannot be saved | endpointUrl is not https://... | Move the upstream behind HTTPS; localhost and plain HTTP are not accepted for provider bindings |
| The binding saves but the tool does not appear in the MCP client | Missing MCP Builder exposure, stale connector state, or missing scopes | Refresh MCP Builder, reconnect the client, and verify mcp.connect plus binding.invoke:{bindingKey} |
The tool returns provider_secret_unavailable | The secret reference is missing or unreadable | Verify the platform-managed secret exists and that the binding uses the correct secretName |
The tool returns provider_request_failed | Upstream timeout, network failure, or blocked redirect | Check the upstream endpoint, timeout, and redirect behavior |
| The tool returns text instead of JSON | The upstream returned a non-JSON content type | Return application/json from the provider if you want structured MCP output |
| You pointed the provider binding at an upstream MCP endpoint and expected auto-imported tools | provider is an HTTP adapter, not upstream MCP bridging | Use an HTTPS JSON adapter in front of the MCP server, or connect the upstream MCP server directly to the client |
Related guides
Updated Jun 19, 2026
