Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.chatblocks.ai/llms.txt

Use this file to discover all available pages before exploring further.

The outbound MCP connector lets you point ChatBlocks at any Model Context Protocol server that speaks Streamable HTTP. List its tools, call one of them as the query for a block binding, and the platform refreshes on the usual cadence. This is how you wire blocks to Linear, GitHub, Notion, or any internal MCP server you’ve built — without writing a custom connector.

Add an MCP data source

1

Go to the wizard

/settings/data-sources/new/mcp.
2

Pick a label and the server URL

The URL must be HTTPS. Same SSRF rules as Postgres — scheme allowlist, hostname blocklist (localhost, *.local), literal-IP private-range matcher (including the ::ffff:hex IPv6 form).
3

Optionally paste a bearer token

Most third-party MCP servers require authentication. Paste the token; it’s stored in the encrypted credential blob.
4

Click Test Connection

The wizard runs a one-off connect + tools/list against the URL. On success, you see the discovered tools, so you can verify the surface before binding any blocks. The connection is closed immediately after.
5

Pick a cadence and save

Same cadence options as the other connectors: 5, 15, 60, 360, or 1440 minutes.

Connection model

The connector uses the official @modelcontextprotocol/sdk — the same SDK we use for inbound MCP. Transport is StreamableHTTPClientTransport with an optional bearer header. Each refresh creates a fresh client per request. Convex actions are short-lived; a long-lived MCP client would die between invocations. Refresh runs in a "use node" Convex action because the SSRF check imports node:dns/promises.

SSRF and DNS rebinding

Same two-layer defense as Postgres:
  • Sync check at add time and every refresh — HTTPS-only, hostname blocklist, literal-IP private-range matcher.
  • Async DNS re-resolve before every connectdns.promises.lookup({ all: true }) rejects if any A/AAAA record falls in a private range. Defeats DNS rebinding.
A malicious server can’t trick the platform into connecting to your internal network even if it controls DNS.

Discover the tool surface

Two paths to see what’s available:
The wizard’s Test Connection button returns the full tool list with descriptions. Useful before saving so you can copy a tool name into a binding.

Bind a block

The query type is mcp.tool. The params carry the tool name, its arguments, and which field of the result to project from.
{
  "binding": {
    "dataSourceId": "<mcp-data-source-id>",
    "queryConfig": {
      "type": "mcp.tool",
      "params": {
        "tool": "linear.search_issues",
        "args": { "query": "is:open team:eng" },
        "projectionField": "issues"
      }
    },
    "projection": {
      "fields": {
        "label": { "literal": "Open eng issues" },
        "items": { "source": "issues", "format": "number" }
      }
    }
  }
}
projectionField tells the connector which field of the tool’s return object to hand off to the projection mapping. If the tool returns { issues: [...], cursor: "..." }, set projectionField: "issues".

Credential storage

The credential blob is JSON: { serverUrl, authToken? }. Encrypted via the workspace DEK (envelope encryption). Every decryption is audit-logged with the calling actor — same pattern as the other connectors.

What’s next

BYOK keys

Bring your own LLM key — used by scheduled runs that drive the agent loop.

Scheduled runs

Drive periodic agent loops over MCP — connect outbound MCPs and let your agent compose results.