dev.mcpg.backend.amqpAMQP Binding
Backend
alpha
v0.1.0-alpha.17Reaches a RabbitMQ / AMQP 0.9.1 broker as three per-binding operations: publish a message whose body is the tool’s arguments JSON, run request/reply RPC (publishing with reply_to plus a correlation id and awaiting the correlated reply on a private exclusive queue), or pull one message off a queue. Publisher confirms and the mandatory-routing flag turn an unroutable message into a tool error rather than a silent drop.
Use it to Let an agent enqueue a background job on RabbitMQ.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
governance:
access:
# An identity source is what raises the gateway's reachable trust ceiling
# to `verified`. Without one the tool below never reaches tools/list.
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.amqp
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-amqp:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: jobs.enqueue
title: "Enqueue job"
description: Enqueue a background job on the work queue.
governance:
minimum_trust: verified
input_schema:
type: object
properties:
task: { type: string }
payload: { type: object }
required: [task]
backend:
kind: amqp
uri: "amqps://mcpg:${env.RABBIT_PASSWORD}@rabbit.internal:5671/%2f"
op: publish
routing_key: "jobs"
content_type: application/json
timeout_ms: 10000
dev.mcpg.backend.bigqueryBigQuery Binding
Backend
alpha
v0.1.0-alpha.17Runs one operator-fixed Standard-SQL statement against Google BigQuery over the REST jobs.query API and returns rows as JSON typed by the result schema, authenticating with a GCP service-account key resolved from the gateway secret-resolver. Caller values never reach the SQL text — they bind as positional query parameters — and a read-only guard, a row cap and a maximum_bytes_billed cost cap bound the query, with query.dry_run turning the same binding into a no-charge bytes/USD cost estimator.
Use it to Expose a costed, read-only warehouse query to an agent.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
# Raises the reachable trust ceiling to `header_asserted`. Without it the
# ceiling is `unauthenticated` and the tool below is filtered out.
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.bigquery
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-bigquery:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: analytics.daily_signups
title: "Daily signups"
description: Daily signup counts since a given date.
annotations: { read_only: true, open_world: false }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
since: { type: string }
required: [since]
backend:
kind: bigquery
project_id: "acme-analytics"
dataset: "analytics"
location: "EU"
auth:
mode: service_account
credentials_json: "${env.BIGQUERY_SA_KEY}"
query:
read_only: true
max_rows: 1000
maximum_bytes_billed: 1073741824 # 1 GiB cost cap
timeout_ms: 60000
statement: "SELECT day, count(*) AS signups FROM `acme-analytics.analytics.events` WHERE day >= ? GROUP BY day ORDER BY day"
params: ["arguments.since"]
dev.mcpg.backend.clickhouseClickHouse Binding
Backend
alpha
v0.1.0-alpha.17Runs an operator-fixed analytical statement against a ClickHouse server (OSS, Cloud, or Altinity) over its HTTP interface and returns JSONEachRow rows as JSON, with `?` placeholders filled from CEL expressions that the driver escapes and serialises as ClickHouse SQL literals rather than concatenating raw. A read-only keyword guard plus dispatch over HTTP GET — which ClickHouse itself treats as read-only at the server — fence the query, and operator-fixed query.settings (max_execution_time, max_threads, max_memory_usage) cap each call.
Use it to Query an event-analytics ClickHouse cluster from an agent.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.clickhouse
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-clickhouse:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: events.by_user
title: "Recent user events"
description: Recent events for a user.
annotations: { read_only: true, open_world: false }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
user_id: { type: string }
required: [user_id]
backend:
kind: clickhouse
url: "https://ch.internal:8443"
database: analytics
auth:
username: reader
password: "${env.CLICKHOUSE_READER_PASSWORD}"
statement: "SELECT event, ts FROM events WHERE user_id = ? ORDER BY ts DESC LIMIT 100"
params: ["arguments.user_id"]
query:
read_only: true
max_execution_time_ms: 30000
max_result_rows: 10000
dev.mcpg.backend.commandCommand Binding
Backend
alpha
v0.1.0-alpha.17Turns an existing local CLI, script, or batch job into an MCP surface by spawning the operator-configured process, writing the call arguments to its stdin as one JSON document, and capturing stdout and stderr under byte and wall-clock caps. The executable path is fixed in config and never derived from a request, only args[] entries are CEL-templated from caller values, and the substitution never re-enters a shell — but the child inherits the gateway’s uid and environment, so confine it with OS-level controls rather than with plugin capabilities.
Use it to Expose an internal CLI as a governed MCP tool.
- Licence
- Apache-2.0
- Capabilities
- none required
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
# Baked into the published image, so no registry pull is needed.
- id: dev.mcpg.backend.command
class: backend
source: { path: /usr/local/lib/mcpg/plugins/dev.mcpg.backend.command/plugin.so }
mcp:
capabilities:
tools:
- name: docs.render
title: "Render document"
description: Render a document with the local renderer CLI.
governance:
minimum_trust: verified
input_schema:
type: object
properties:
id: { type: string }
required: [id]
backend:
kind: command
command: /usr/local/bin/render
args: ["--format", "json", "--id", "${arguments.id}"]
timeout_ms: 5000
max_output_bytes: 65536
require_json_stdout: true
dev.mcpg.backend.duckdbDuckDB Binding
Backend
alpha
v0.1.0-alpha.17Runs operator-fixed analytical SQL against an embedded DuckDB engine — no server to run — over an in-memory or file database, local Parquet and CSV, and S3 or HTTP object stores when the httpfs extension is enabled. Caller values bind as `?` parameters rather than being interpolated, external filesystem and network access is default-deny until the operator opts in, and read_only opens file databases read-only on top of a read-only statement guard.
Use it to Query a Parquet data lake without standing up a warehouse.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.duckdb
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-duckdb:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: analytics.region_revenue
title: "Region revenue"
description: Quarterly revenue by region from the Parquet lake.
annotations: { read_only: true, open_world: false }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
quarter: { type: string }
required: [quarter]
backend:
kind: duckdb
database: ":memory:"
read_only: true
allow_external_access: true
init_sql:
- "INSTALL httpfs; LOAD httpfs;"
- "CREATE SECRET s3 (TYPE S3, KEY_ID '${env.AWS_LAKE_ACCESS_KEY_ID}', SECRET '${env.AWS_LAKE_SECRET_ACCESS_KEY}', REGION 'eu-west-1')"
statement: "SELECT region, sum(amount) AS revenue FROM read_parquet('s3://acme-lake/sales/*.parquet') WHERE quarter = ? GROUP BY region"
params: ["arguments.quarter"]
query:
statement_timeout_ms: 60000
max_rows: 10000
dev.mcpg.backend.dynamodbDynamoDB Binding
Backend
alpha
v0.1.0-alpha.17Exposes Amazon DynamoDB as MCP tools, one operator-fixed table plus one operation (get_item, put_item, delete_item, update_item, query, scan, batch_get, batch_write) per binding, over the modern aws-lc-rs/rustls AWS client using static keys or the default credential chain (IRSA, instance role, env, profile). The table is never caller-supplied, keys are validated against the declared key schema, CEL params bind expression placeholders server-side as ExpressionAttributeValues, and mutating operations are flagged as aws.mutates on the audit record.
Use it to Read and update an orders table from an agent.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.dynamodb
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-dynamodb:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
# No hand-written input_schema: the plugin derives one that marks
# `key_condition_expression` required, and a hand-written `required`
# array would REPLACE that wholesale and advertise a call shape that
# errors on every invocation.
- name: orders.by_customer
title: "Orders by customer"
description: >-
Query a customer's orders by status. Call with
key_condition_expression: "customer_id = :cid AND #s = :status".
annotations: { read_only: true, open_world: false }
governance:
minimum_trust: verified
backend:
kind: dynamodb
region: us-east-1
table: orders
operation: query
partition_key: { name: customer_id, type: S }
sort_key: { name: status, type: S }
# Operator-fixed placeholders; bound server-side, never interpolated.
params:
":cid": "arguments.customer_id"
":status": "arguments.status"
limits:
max_page_size: 100
timeout_ms: 8000
dev.mcpg.backend.elasticsearchElasticsearch Binding
Backend
alpha
v0.1.0-alpha.17Reaches an Elasticsearch or OpenSearch cluster over the REST API, one operation per binding — search, count, get, index, delete, bulk, msearch, or a vector knn nearest-neighbour search over a dense_vector field for RAG. The index arrives as an allowlisted, path-injection-guarded argument, write operations stay closed until allow_writes is set, scripting is default-deny, and API-key, basic, or bearer auth resolves per caller without ever appearing in logs or the response envelope.
Use it to Semantic and full-text search over an application log index.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.elasticsearch
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-elasticsearch:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: logs.search
title: "Search logs"
description: Full-text search over the application logs.
annotations: { read_only: true, open_world: false }
governance:
minimum_trust: header_asserted
backend:
kind: elasticsearch
urls: ["https://es.internal:9200"]
operation: search
index_allowlist: ["logs-*"]
default_index: logs-app
max_size: 200
operation_timeout_ms: 30000
auth:
kind: api_key
api_key: "${env.ES_API_KEY}"
- name: logs.index_event
title: "Index log event"
description: Index a structured log document.
governance:
minimum_trust: verified
backend:
kind: elasticsearch
urls: ["https://es.internal:9200"]
operation: index
index_allowlist: ["logs-app"]
default_index: logs-app
allow_writes: true
auth:
kind: basic
username: ingest
password: "${env.ES_INGEST_PASSWORD}"
dev.mcpg.backend.emailEmail Binding
Backend
alpha
v0.1.0-alpha.17Sends mail through an SMTP server and reads a mailbox over IMAP, one operation per binding: op: send builds a message from the call’s to / subject / body arguments and delivers it, op: read fetches the most recent messages as envelope plus text body using BODY.PEEK so it never marks anything as seen. TLS is rustls (STARTTLS or implicit) and the login password resolves through the gateway secret-resolver rather than living in config.
Use it to Send alert mail and triage a shared support inbox.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.email
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-email:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: alerts.notify
title: "Send alert email"
description: Send an alert email.
governance:
minimum_trust: verified
input_schema:
type: object
properties:
to: { type: string }
subject: { type: string }
body: { type: string }
required: [to, subject, body]
backend:
kind: email
op: send
host: "smtp.corp.example.com"
port: 587
tls: starttls
username: "svc-mcpg"
password: "${env.SMTP_PASSWORD}"
from: "alerts@corp.example.com"
timeout_ms: 15000
- name: inbox.recent
title: "Recent inbox mail"
description: Read the most recent messages from the shared inbox.
annotations: { read_only: true }
governance:
minimum_trust: verified
backend:
kind: email
op: read
host: "imap.corp.example.com"
port: 993
tls: implicit
username: "shared-inbox@corp.example.com"
password: "${env.IMAP_PASSWORD}"
mailbox: INBOX
limit: 20
dev.mcpg.backend.ftpFTP Binding
Backend
alpha
v0.1.0-alpha.17Lists a directory, reads a file, or writes a file on an FTP / FTPS server — the classic partner drop-directory integration — as tools or as MCP resources, with explicit FTPS (AUTH TLS) required by default over a pure-Rust rustls stack. The caller’s path is joined under an operator-configured base directory and any `..` segment is rejected before a single FTP command is sent, with a byte cap on every read and write.
Use it to Pick up partner CSV drops from an FTPS directory.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.ftp
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-ftp:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: dropbox.read
title: "Read partner file"
description: Read a file from the partner drop directory.
annotations: { read_only: true }
governance:
minimum_trust: verified
input_schema:
type: object
properties:
path: { type: string }
required: [path]
backend:
kind: ftp
op: get
host: "ftp.partner.example.com"
port: 21
user: "svc-mcpg"
password: "${env.FTP_PASSWORD}"
tls: true # require FTPS (default)
path: "/outbound"
max_bytes: 10485760
timeout_ms: 15000
dev.mcpg.backend.graphqlGraphQL Binding
Backend
alpha
v0.1.0-alpha.17Fronts a GraphQL endpoint by POSTing a standard { query, variables } document: the operator pins one query or mutation at config time and the caller’s arguments become the variables, so a client gets one governed operation instead of an open GraphQL endpoint. A 200 response carrying a non-empty errors array is surfaced as a tool error, and a DNS-rebinding guard pins the validated address for the life of the cached client.
Use it to Expose one catalog GraphQL query as a governed tool.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
# Baked into the published image, so no registry pull is needed.
- id: dev.mcpg.backend.graphql
class: backend
source: { path: /usr/local/lib/mcpg/plugins/dev.mcpg.backend.graphql/plugin.so }
granted_capabilities:
- network_outbound
mcp:
capabilities:
tools:
- name: catalog.list_products
title: "List products"
description: List products from the catalog service.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
limit: { type: integer }
backend:
kind: graphql
url: "https://catalog.internal/graphql"
operation: "query($limit: Int) { products(limit: $limit) { id name } }"
timeout_ms: 2000
max_response_bytes: 65536
headers:
authorization: "Bearer ${env.CATALOG_API_TOKEN}"
dev.mcpg.backend.grpcgRPC Binding
Backend
Enterprise
alpha
v0.1.0-alpha.17Calls one RPC method on a gRPC service through its JSON transcoding surface (grpc-gateway, the Envoy gRPC-JSON filter, Connect, or equivalent), POSTing the caller’s arguments to {origin}/{service}/{method}. The URL, service, and method are transport-only routing facts and a credential reference in any of them is rejected at registration; credentials belong in header values, behind the same DNS-rebinding guard and per-credential client cache as the HTTP binding.
Use it to Expose one internal gRPC method as an MCP tool.
- Licence
- BUSL-1.1
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
# Baked into the published image, so no registry pull is needed.
- id: dev.mcpg.backend.grpc
class: backend
source: { path: /usr/local/lib/mcpg/plugins/dev.mcpg.backend.grpc/plugin.so }
granted_capabilities:
- network_outbound
mcp:
capabilities:
tools:
- name: users.get
title: "Get user"
description: Look up a user record.
annotations: { read_only: true }
governance:
minimum_trust: verified
input_schema:
type: object
properties:
id: { type: string }
required: [id]
backend:
kind: grpc
url: "https://users.internal:8443"
service: user.v1.UserService
method: GetUser
timeout_ms: 2000
max_response_bytes: 65536
headers:
authorization: "Bearer ${env.USERS_API_TOKEN}"
dev.mcpg.backend.hanaSAP HANA Binding
Backend
alpha
v0.1.0-alpha.17Runs an operator-fixed statement against a SAP HANA database over its native HDB SQL protocol using the pure-Rust hdbconnect_async driver with rustls TLS and a lazy bb8 pool that opens no socket until the first call. Caller values bind as server-side prepared-statement parameters rather than being interpolated, a read-only keyword guard fences the statement, and list_tables / list_columns operations let an agent discover the schema from SYS.TABLES and SYS.TABLE_COLUMNS without writing SQL.
Use it to Read SAP business data from HANA inside an agent workflow.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.hana
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-hana:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: sap.order_lookup
title: "Look up SAP order"
description: Look up a sales order in SAP HANA by id.
annotations: { read_only: true, open_world: false }
governance:
minimum_trust: verified
input_schema:
type: object
properties:
order_id: { type: string }
required: [order_id]
backend:
kind: hana
host: "hana.corp.example.com"
port: 39015
user: "MCPG_READER"
password: "${env.HANA_READER_PASSWORD}"
database: "HXE"
use_tls: true
tls_verify_peer: true
operation: query
read_only: true
query: "SELECT ORDER_ID, CUSTOMER, TOTAL FROM SALES.ORDERS WHERE ORDER_ID = ?"
params: ["arguments.order_id"]
pool_max_size: 6
timeout_ms: 5000
max_rows: 1000
dev.mcpg.backend.httpHTTP Binding
Backend
alpha
v0.1.0-alpha.17The general-purpose binding for any REST/JSON API: a POST binding sends the caller’s arguments as a JSON body, a GET binding renders them into a deterministic sorted query string, and the response is checked against expected_status_codes and optional JSON parseability. The URL and every header value are CEL templates that resolve `${cred://issuer/target}` per caller identity at dispatch time, with one cached client per resolved-credential bundle, a DNS-rebinding guard that pins the validated address, and streaming progress chunks when the upstream streams.
Use it to Front any existing internal REST API as a governed tool.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
# Baked into the published image, so no registry pull is needed.
- id: dev.mcpg.backend.http
class: backend
source: { path: /usr/local/lib/mcpg/plugins/dev.mcpg.backend.http/plugin.so }
granted_capabilities:
- network_outbound
# A `cred://` reference resolves per request against a registered
# credential_issuer. Naming an issuer that no plugins[] entry declares
# fails EVERY call with "unknown credential_issuer plugin".
- id: dev.mcpg.credential.static
class: credential_issuer
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/credential-static:protocol-1" }
config:
targets:
orders-api:
value: "${env.ORDERS_API_TOKEN}"
ttl_seconds: 3600
mcp:
capabilities:
tools:
- name: orders.fetch
title: "Fetch order"
description: Fetch an order by id.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
id: { type: string }
required: [id]
backend:
kind: http
url: "https://orders.internal/v1/orders/${arguments.id}"
method: get
timeout_ms: 2000
max_response_bytes: 65536
expected_status_codes: [200]
require_json_response: true
headers:
authorization: "Bearer ${cred://dev.mcpg.credential.static/orders-api}"
dev.mcpg.backend.kafkaKafka Binding
Backend
Enterprise
alpha
v0.1.0-alpha.18Turns a Kafka consumer group into a synchronous MCP tool: the call payload is produced to a request topic with a unique correlation_id header and the first reply on the response topic carrying that id is returned, with non-matching messages skipped rather than consumed. It forwards W3C trace context and idempotency headers as record headers, resolves SASL credentials (PLAIN, SCRAM-SHA-256/512, OAUTHBEARER — enough for Confluent Cloud and AWS MSK), and ships a second entity that turns any message on a topic into a resource-change notification.
Use it to Call an event-driven worker as if it were an API.
- Licence
- BUSL-1.1
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.kafka
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-kafka:protocol-1" }
granted_capabilities:
- network_outbound
config:
bootstrap_servers: "kafka-1:9092,kafka-2:9092"
group_id: mcpg
mcp:
capabilities:
tools:
- name: events.enrich
title: "Enrich event"
description: Enrich an event through the enrichment worker.
governance:
minimum_trust: verified
backend:
kind: kafka
request_topic: enrich.requests
response_topic: enrich.responses
timeout_ms: 10000
max_response_bytes: 65536
security_protocol: SASL_SSL
sasl_mechanism: SCRAM-SHA-256
sasl_username: "${env.KAFKA_USERNAME}"
sasl_password: "${env.KAFKA_PASSWORD}"
dev.mcpg.backend.ldapLDAP Binding
Backend
Enterprise
alpha
v0.1.0-alpha.17Binds a service account against LDAP or Active Directory over LDAP/LDAPS and runs directory searches — people, groups, org structure — returning the matched entries as JSON. The search filter is CEL-templated from the tool arguments with every interpolated string RFC 4515 LDAP-escaped, so a caller cannot break out of the filter.
Use it to Let an agent look up staff and group membership in AD.
- Licence
- BUSL-1.1
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.ldap
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-ldap:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: directory.search_people
title: "Search directory"
description: Find people in the corporate directory.
annotations: { read_only: true }
governance:
minimum_trust: verified
input_schema:
type: object
properties:
q: { type: string }
required: [q]
backend:
kind: ldap
url: "ldaps://dc1.corp.example.com:636"
bind_dn: "cn=svc-mcpg,ou=svc,dc=corp,dc=example,dc=com"
bind_password: "${env.LDAP_SVC_PASSWORD}"
base_dn: "ou=people,dc=corp,dc=example,dc=com"
scope: subtree
filter: "(&(objectClass=person)(|(cn=*${arguments.q}*)(mail=*${arguments.q}*)))"
attributes: [cn, mail, department, manager, memberOf]
size_limit: 100
timeout_ms: 10000
dev.mcpg.backend.llm.anthropicAnthropic Messages API Backend
Backend
alpha
v0.1.0-alpha.17Puts the Anthropic Messages API behind a governed MCP tool (backend.kind: anthropic_chat) instead of handing an API key to every client: a binding pins one model, one system/user prompt template pair rendered over the caller’s arguments, and one execution policy, returning free-form text or JSON validated against the binding’s output_schema via the forced-tool pattern. It runs a bounded agentic loop over an explicit allowlist of other tools in the same gateway, streams tokens over SSE, and enforces per-binding token and daily-USD budget caps before spending.
Use it to Offer Claude to internal clients under a spend cap.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.llm.anthropic
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-llm-anthropic:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: incident.summarize
title: "Summarise incident"
description: Summarise an incident report into a structured verdict.
governance:
minimum_trust: verified
input_schema:
type: object
properties:
report: { type: string }
required: [report]
backend:
kind: anthropic_chat
api_key: "${env.ANTHROPIC_API_KEY}"
model: claude-sonnet-4-5
prompt:
system: You are a terse incident analyst. Answer only as JSON.
user: "Summarise this report:\n{{ input.report }}"
sampling:
temperature: 0
max_completion_tokens: 1024
response_format:
mode: json_schema
on_mismatch: retry_once
budget:
usd_daily_cap: 25
output_schema:
type: object
properties:
severity: { type: string }
summary: { type: string }
required: [severity, summary]
dev.mcpg.backend.llm.compatOpenAI-Compatible Backends
Backend
alpha
v0.1.0-alpha.17Reaches any endpoint that speaks the OpenAI /chat/completions and /embeddings wire format but is not OpenAI — vLLM, LocalAI, Together, Groq, OpenRouter, llama.cpp’s OpenAI server, or Vertex AI’s OpenAI compatibility surface — through two backend kinds, compat_chat and compat_embedding. The operator supplies base_url and the API key is optional, so unauthenticated self-hosted servers work unmodified, and structured output is validated binding-side so an endpoint with weak native JSON-schema support still gets a hard contract.
Use it to Govern a self-hosted vLLM deployment like a hosted provider.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.llm.compat
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-llm-compat:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: local.chat
title: "Local model chat"
description: Chat with the in-cluster vLLM deployment.
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
question: { type: string }
required: [question]
backend:
kind: compat_chat
base_url: "http://vllm.internal.svc:8000/v1" # required
# api_key omitted — this vLLM endpoint accepts unauthenticated requests
model: meta-llama/Llama-3.1-8B-Instruct
prompt:
system: You are a concise assistant.
user: "{{ input.question }}"
response_format:
mode: text
sampling:
temperature: 0.2
max_completion_tokens: 1024
- name: local.embed
title: "Embed passages"
description: Embed passages against the local inference server.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
backend:
kind: compat_embedding
base_url: "http://vllm.internal.svc:8000/v1"
model: BAAI/bge-large-en-v1.5
max_batch_size: 64
cache: { enabled: true }
dev.mcpg.backend.llm.geminiGoogle Gemini Backends
Backend
alpha
v0.1.0-alpha.17Reaches Google’s AI Studio API — Gemini chat, embeddings and Imagen image generation — as three backend kinds in one artifact, so the API key stays in the gateway instead of being distributed to every client. Prompts are templates over the caller’s arguments, replies are re-validated against a JSON schema, and per-binding token and daily-USD caps stop a runaway loop before it spends.
Use it to Give agents Gemini access without handing every client an API key.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.llm.gemini
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-llm-gemini:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: page.extract
description: Extract structured order details from a screenshot.
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
shot: { type: string, description: "image URL or mcpg-resource:// URI" }
required: [shot]
backend:
kind: gemini_chat
api_key: "${env.GEMINI_API_KEY}"
model: gemini-2.0-flash
prompt:
system: You read screenshots and answer only as JSON.
user: Extract the visible order details.
image_inputs: [shot]
sampling: { temperature: 0 }
response_format: { mode: json_schema }
output_schema:
type: object
properties:
order_id: { type: string }
total: { type: string }
required: [order_id]
budget: { usd_daily_cap: 25 }
dev.mcpg.backend.llm.openaiOpenAI + Azure OpenAI Backends
Backend
alpha
v0.1.0-alpha.17Reaches OpenAI and Azure OpenAI as ten backend kinds in one artifact — chat, embeddings, image, text-to-speech and speech-to-text, each in a public-API and an Azure-deployment flavour. A chat binding can run a bounded tool loop over other bindings in the same gateway, refusing any tool the model invents outside the configured allowlist before the call leaves the plugin.
Use it to Route GPT calls through the gateway with per-binding spend caps.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.llm.openai
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-llm-openai:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: ticket.classify
description: Classify a support ticket into a category and urgency.
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
body: { type: string }
required: [body]
backend:
kind: openai_chat # or azure_openai_chat with a full base_url
api_key: "${env.OPENAI_API_KEY}"
model: gpt-4o-mini
prompt:
system: You classify support tickets. Answer only as JSON.
user: "{{ input.body }}"
sampling: { temperature: 0 }
response_format: { mode: json_schema }
output_schema:
type: object
properties:
category: { type: string }
urgency: { type: string }
required: [category, urgency]
budget: { usd_daily_cap: 50 }
- name: docs.embed
description: Embed one or more passages.
governance:
minimum_trust: header_asserted
backend:
kind: openai_embedding
api_key: "${env.OPENAI_API_KEY}"
model: text-embedding-3-small
dimensions: 512
cache: { enabled: true }
dev.mcpg.backend.llm.stabilityStability AI Image Generation Backend
Backend
alpha
v0.1.0-alpha.17Reaches Stability AI’s Stable Image API — the Core, SD3 and Ultra SKUs, selected through the binding’s model field — and pushes the generated bytes into the gateway content store, returning an mcpg-resource:// URI the client fetches through an ordinary MCP resource read. A content-filtered response surfaces as a clear error rather than an empty success, and a per-call timeout plus a retry policy — not a spend cap — bound the binding.
Use it to Let an agent generate product images without handing out a Stability API key.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.llm.stability
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-llm-stability:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: art.generate
description: Generate an illustration from a prompt.
annotations: { read_only: false, open_world: true }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties:
prompt: { type: string }
size: { type: string, description: "WxH pixels or a W:H ratio" }
required: [prompt]
backend:
kind: stability_image
api_key: "${env.STABILITY_API_KEY}"
model: core # core | sd3 | ultra
timeout_ms: 60000
defaults:
size: "1024x1024"
output_format: webp
negative_prompt: "blurry, low quality"
dev.mcpg.backend.markdownMarkdown Conversion
Backend
alpha
v0.1.0-alpha.3Converts documents — DOCX, PPTX, XLSX, PDF, HTML, EPUB, Outlook .msg, ZIP archives, images, audio, CSV, JSON, XML, feeds and Jupyter notebooks — into LLM-friendly Markdown, shipping both an MCP tool the model can call and a transform entity that converts a document already in flight through a pipeline. It never reads the local filesystem and declares no filesystem capability: bytes arrive inline, from the gateway content store, or over HTTPS only when the operator opts in.
Use it to Turn a customer’s uploaded DOCX or PDF into agent-readable text.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.markdown
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-markdown:protocol-1" }
# Declared because the opt-in `sources.url` mode can open a socket; the
# grant is fail-closed, so the entry must carry it either way.
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: convert_to_markdown
description: Convert a document (DOCX, PDF, XLSX, EPUB, .msg, ...) to Markdown.
governance:
minimum_trust: header_asserted
backend:
kind: markdown
limits:
# Byte ceilings are plain integers — there is no human-size parser,
# and a "20Mi" string fails registration. Omitted keys take the
# engine defaults (20 MiB in, 4 MiB out, 200 MiB expanded).
max_depth: 3
max_embedded_documents: 64
max_table_rows: 5000
timeout_ms: 30000
output:
front_matter: yaml # none | yaml | toml
tables: gfm # gfm | html | csv
formats:
enable: [text, csv, json, ipynb, xml, feed, html,
docx, pptx, spreadsheet, epub, zip, pdf,
image, audio, msg]
sources:
inline: true # `content` (base64) or `text` argument
resource: true # mcpg-resource:// from the content store
url: false # https:// fetch stays off unless opted in
dev.mcpg.backend.mockMock Binding
Backend
alpha
v0.1.0-alpha.17Answers a tool, prompt or resource call with a response the operator wrote in config — no network, no filesystem, no subprocess — with optional simulated latency, a simulated error mode, and a passthrough mode that emits a literal CallToolResult so a binding can return image, audio or embedded-resource content. Use it to stand up a tool contract before the real system exists and to keep contract tests and offline demos deterministic.
Use it to Ship a tool contract before the backing service exists.
- Licence
- Apache-2.0
- Capabilities
- none required
Configuration sample
plugins:
# Baked into the published image, so no registry pull is needed.
- id: dev.mcpg.backend.mock
class: backend
kind: native
source: { path: /usr/local/lib/mcpg/plugins/dev.mcpg.backend.mock/plugin.so }
# No granted_capabilities: the plugin declares no required capabilities.
mcp:
capabilities:
tools:
- name: dev.echo
description: Returns a fixed fixture response for local development.
input_schema:
type: object
properties:
query: { type: string }
backend:
kind: mock
response: { status: ok, items: [{ id: item-1, label: First item }] }
delay_ms: 0
error: false
passthrough: false
governance:
minimum_trust: unauthenticated
- name: dev.error_scenario
description: Simulates an upstream failure so error handling can be tested.
backend:
kind: mock
response: null
error: true
error_message: "simulated upstream timeout"
governance:
minimum_trust: unauthenticated
dev.mcpg.backend.mssqlMSSQL Binding
Backend
Enterprise
alpha
v0.1.0-alpha.17Dispatches tool calls to Microsoft SQL Server over TDS on a pooled, rustls-encrypted connection, binding @P1, @P2, … placeholders from an ordered list of CEL expressions evaluated against the tool arguments. The statement text is operator-fixed and values cross the wire as TDS parameters, so caller input cannot alter the query; op: query returns rows and op: execute returns rows-affected.
Use it to Expose an on-prem SQL Server HR table as a read-only tool.
- Licence
- BUSL-1.1
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.mssql
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-mssql:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: directory.find_employee
description: Look up an employee by id.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties: { id: { type: integer } }
required: [id]
backend:
kind: mssql
host: "sql1.corp.example.com"
port: 1433
database: "HR"
user: "svc_mcpg"
password: "${env.MSSQL_HR_PASSWORD}"
encryption: required
trust_server_certificate: true
op: query
query: "SELECT id, full_name, email FROM dbo.employees WHERE id = @P1"
params: ["arguments.id"] # bound to @P1 as a TDS parameter
size_limit: 100
pool_max_size: 8
timeout_ms: 10000
dev.mcpg.backend.natsNATS Binding
Backend
alpha
v0.1.0-alpha.18Dispatches tool calls as NATS request/reply on an operator-fixed subject and turns the reply into the tool result, so a service that already answers on NATS needs no HTTP front end. Inbound trace headers propagate to the responder, oversized replies are truncated and flagged, and the same artifact ships a nats_topic watch strategy that turns messages on a subject into resources/updated notifications.
Use it to Front an existing NATS request/reply worker as an MCP tool.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.nats
class: backend
kind: native
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-nats:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: pricing.quote
description: Request a price quote from the pricing worker over NATS.
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties: { sku: { type: string } }
required: [sku]
backend:
kind: nats
url: "nats://nats.internal:4222"
subject: pricing.quote
timeout_ms: 2000
max_response_bytes: 65536
# credentials_path: /etc/mcpg/nats.creds
resources:
# The same artifact ships the `nats_topic` watch strategy, so a resource
# can be invalidated by a message on a subject.
- name: catalog.snapshot
description: The product catalog.
uri: "catalog://snapshot"
governance:
minimum_trust: header_asserted
backend: { kind: nats, url: "nats://nats.internal:4222", subject: catalog.read }
watch:
strategy:
type: nats_topic
subject: catalog.changed
dev.mcpg.backend.odbcODBC Binding
Backend
alpha
v0.1.0-alpha.16Reaches any database with an installed unixODBC driver — Teradata, Sybase, Informix, IBM Db2, Vertica, SAP HANA and the rest of the long tail — running an operator-fixed statement whose ? placeholders are bound server-side via SQLBindParameter, behind a read-only keyword guard. Two catalog operations (SQLTables and SQLColumns) let an agent discover tables and columns without writing SQL, with every filter passed as an argument rather than interpolated.
Use it to Reach a Teradata or Db2 warehouse that has no native driver.
- Licence
- Apache-2.0 (plugin source). The artifact bundles LGPL unixODBC C sources; redistribution terms for the bundled driver are not yet decided, and the crate is deliberately held back from the public mirror.
- Capabilities
- network_outbound
- Source
- not mirrored publicly
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.odbc
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-odbc:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: orders.by_customer
description: Recent orders for a customer, from the Teradata warehouse.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties: { customer_id: { type: integer } }
required: [customer_id]
backend:
kind: odbc
connection_string: "Driver={Teradata};DBCName=tdprod;UID=svc;PWD=${env.TERADATA_PASSWORD}"
driver_label: teradata
query: "SELECT order_id, total FROM orders WHERE customer_id = ? ORDER BY order_id"
params: ["arguments.customer_id"] # bound via SQLBindParameter
read_only: true
max_rows: 500
timeout_ms: 15000
# Schema discovery without writing SQL: the filters are passed as
# arguments to the SQLTables catalog function, never interpolated.
- name: db.list_tables
description: List the tables an agent may query.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
backend:
kind: odbc
connection_string: "Driver={Teradata};DBCName=tdprod;UID=svc;PWD=${env.TERADATA_PASSWORD}"
driver_label: teradata
operation: list_tables
schema_arg: schema
table_type: "TABLE,VIEW"
dev.mcpg.backend.openapiOpenAPI Binding
Backend
alpha
v0.1.0-alpha.17Turns an OpenAPI 3.0/3.1 document into MCP tools: you register the spec once as a named source on the plugin entry, and each operation becomes a tool whose input and output schemas are derived from its parameters, request body and responses — nobody hand-writes a schema or a URL. Calls dispatch as outbound HTTP behind the DNS-rebinding guard with credentials injected exactly as the spec’s securitySchemes describe, and a whole spec can be bulk-exposed under a configurable capability ceiling.
Use it to Publish an existing REST API as tools without hand-writing schemas.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
# Baked into the published image, so no registry pull is needed.
- id: dev.mcpg.backend.openapi
class: backend
kind: native
source: { path: /usr/local/lib/mcpg/plugins/dev.mcpg.backend.openapi/plugin.so }
granted_capabilities: [network_outbound]
# Unusually for a backend, the spec registry lives on the PLUGIN entry;
# a binding then names only the source and the operation.
config:
sources:
- name: petstore
spec: "file:///etc/mcpg/specs/petstore.yaml"
base_url: https://api.petstore.example.com
headers:
User-Agent: mcpg-gateway
auth:
# Key is the securityScheme name declared in the spec.
api_key: "${cred://dev.mcpg.credential.static/petstore}"
response:
max_response_bytes: 1048576
timeout_ms: 8000
# The issuer the auth block above names. Without this entry every call
# fails with "unknown credential_issuer plugin".
- id: dev.mcpg.credential.static
class: credential_issuer
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/credential-static:protocol-1" }
config:
targets:
petstore:
value: "${env.PETSTORE_API_KEY}"
ttl_seconds: 3600
mcp:
capabilities:
tools:
# inputSchema / outputSchema are derived from the operation — no
# hand-written schema, no hand-written URL.
- name: petstore.adopt
description: Adopt a pet.
governance:
minimum_trust: header_asserted
backend: { kind: openapi, source: petstore, operation: adoptPet }
dev.mcpg.backend.oracleOracle Binding
Backend
Enterprise
alpha
v0.1.0-alpha.17Dispatches tool calls to Oracle Database through rust-oracle/ODPI-C on a pooled connection, binding :1, :2, … placeholders from CEL expressions over the tool arguments so an operator-fixed SQL or PL/SQL statement cannot be altered by the caller. It also introspects the data dictionary (ALL_TABLES / ALL_TAB_COLUMNS, needing no DBA privilege) so an agent can discover a schema, and polls a scalar high-water query to drive resource-change notifications.
Use it to Query an Oracle ERP schema from an agent, injection-safe.
- Licence
- BUSL-1.1
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.oracle
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-oracle:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: directory.find_employee
description: Look up an employee by id.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties: { id: { type: integer } }
required: [id]
backend:
kind: oracle
dsn: "//ora1.corp.example.com:1521/HRPDB1"
username: "svc_mcpg"
password: "${env.ORACLE_HR_PASSWORD}"
op: query
query: "SELECT id, full_name, email FROM employees WHERE id = :1"
params: ["arguments.id"] # bound to :1 as an Oracle bind variable
# Data-dictionary discovery through ALL_TAB_COLUMNS — no DBA_* grant.
- name: directory.list_columns
description: List the columns of a table in the HR schema.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
backend:
kind: oracle
dsn: "//ora1.corp.example.com:1521/HRPDB1"
username: "svc_mcpg"
password: "${env.ORACLE_HR_PASSWORD}"
operation: list_columns
owner: "HR" # bound as :owner
table_arg: "table" # arguments.table bound as :tbl
dev.mcpg.backend.sftpSFTP Binding
Backend
alpha
v0.1.0-alpha.17Lists a directory, reads a file, or writes a file over SSH file transfer using pure-Rust russh crypto (no OpenSSL), exposed either as list/get/put tools or as a files-as-resources surface where resources/list enumerates a directory and resources/read fetches a file. Caller paths join under an operator-configured root with `..` rejected before any SSH call, and host-key verification fails closed unless a SHA-256 fingerprint is pinned or unknown keys are explicitly accepted.
Use it to Read partner drop files from an SFTP server as a tool.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.sftp
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-sftp:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: dropbox.read
description: Read a file from the partner drop directory.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties: { path: { type: string } }
required: [path]
backend:
kind: sftp
op: get # list | get | put
host: "sftp.partner.example.com"
port: 22
username: "svc-mcpg"
password: "${env.SFTP_PASSWORD}"
host_key_sha256: "SHA256:2xUBM/..." # host-key check fails closed
root: "/outbound" # caller paths join under this; `..` rejected
max_bytes: 10485760
timeout_ms: 15000
dev.mcpg.backend.smbSMB Binding
Backend
alpha
v0.1.0-alpha.17Lists a directory, reads a file, or writes a file on an SMB/CIFS share through the system libsmbclient, exposed either as list/get/put tools or as a files-as-resources surface with one MCP resource per file under the configured path. Caller paths join under an operator-configured base with `..` rejected, and a polling watcher fingerprints the directory listing so an added, removed, resized or re-touched file fires resources/updated.
Use it to Give an agent scoped read access to a corporate file share.
- Licence
- Apache-2.0 (plugin source). The artifact links copyleft libsmbclient C sources; redistribution terms for the bundled driver are not yet decided, and the crate is deliberately held back from the public mirror.
- Capabilities
- network_outbound
- Source
- not mirrored publicly
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.smb
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-smb:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: fileshare.read
description: Read a file from the corporate SMB share.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties: { path: { type: string } }
required: [path]
backend:
kind: smb
op: get # list | get | put
host: "fileserver.corp"
share: "shared"
user: "svc-mcpg"
password: "${env.SMB_PASSWORD}"
domain: "CORP"
path: "/outbound" # caller paths join under this; `..` rejected
dev.mcpg.backend.snowflakeSnowflake Binding
Backend
alpha
v0.1.0-alpha.17Runs an operator-fixed analytical statement against a Snowflake warehouse over the REST API, decoding Arrow result sets into JSON rows, with key-pair JWT or password auth resolved at config load. A read-only keyword guard and a max_rows cap bound every statement, caller arguments are never templated into the SQL, and a result_scan operation re-fetches a prior query’s result set by its Snowflake query id for pagination.
Use it to Answer analytics questions from a Snowflake warehouse, read-only and row-capped.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.snowflake
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-snowflake:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: analytics.daily_signups
description: Daily signup counts for the last 30 days.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
input_schema: { type: object, properties: {} }
backend:
kind: snowflake
account: "xy12345.eu-central-1"
warehouse: "ANALYTICS_WH"
database: "PROD"
schema: "PUBLIC"
role: "REPORTER"
auth:
mode: key_pair # key_pair | password
username: "svc_mcpg"
private_key_pem: "${env.SNOWFLAKE_PRIVATE_KEY}"
query:
read_only: true # rejects anything but SELECT/WITH/SHOW/DESCRIBE/EXPLAIN
max_rows: 1000
statement: >
SELECT day, count(*) AS signups
FROM events WHERE day >= dateadd(day, -30, current_date())
GROUP BY day ORDER BY day
dev.mcpg.backend.soapSOAP Binding
Backend
Enterprise
alpha
v0.1.0-alpha.17Dispatches tool calls as SOAP 1.1/1.2 envelopes over outbound HTTP, so a legacy WSDL service becomes an MCP tool with no bridge service in between. Tool arguments are CEL-interpolated and XML-escaped into an operator-supplied body template before the envelope is POSTed, and a <soap:Fault> is parsed into a structured application error with retry guidance rather than surfaced as an opaque HTTP 500.
Use it to Wrap a legacy WSDL service as an MCP tool.
- Licence
- BUSL-1.1
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.soap
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-soap:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: GetWeather
description: Current weather for a city via the legacy SOAP service.
governance:
minimum_trust: header_asserted
input_schema:
type: object
properties: { city: { type: string } }
required: [city]
backend:
kind: soap
endpoint: https://weather.example.com/ws/WeatherService
soap_version: "1.1"
soap_action: "http://weather.example.com/GetWeather"
body_template: |
<wsx:GetWeather xmlns:wsx="http://weather.example.com/">
<City>${arguments.city}</City>
</wsx:GetWeather>
headers:
Authorization: "Bearer ${env.WEATHER_API_TOKEN}"
dev.mcpg.backend.sqlSQL Binding
Backend
alpha
v0.1.0-alpha.17Dispatches tool calls to PostgreSQL, MySQL/MariaDB or SQLite over a pooled connection, with named placeholders always bound as parameters and seven row modes including a keyset-paged stream envelope whose cursor is HMAC-SHA-256 signed and bound to its binding name. The same artifact ships interval-polling and LISTEN/NOTIFY watch strategies for resource-change notifications.
Use it to Query a tenant-scoped Postgres table with a server-side row cap.
- Licence
- Apache-2.0
- Capabilities
- network_outbound
Configuration sample
gateway:
server:
trust_subject_header: true
plugins:
- id: dev.mcpg.backend.sql
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-sql:protocol-1" }
granted_capabilities: [network_outbound]
mcp:
capabilities:
tools:
- name: orders.lookup_by_tenant
title: Lookup Orders by Tenant
description: Return recent orders for a tenant.
annotations: { read_only: true }
governance:
minimum_trust: header_asserted
backend:
kind: sql
driver: postgres # postgres | mysql | mariadb | sqlite
url: "postgres://app:${env.ORDERS_DB_PW}@db:5432/orders"
pool: { max_connections: 10, min_idle: 1 }
query:
sql: "SELECT id, total, placed_at FROM orders WHERE tenant_id = :tenant ORDER BY placed_at DESC LIMIT :effective_limit"
params: ["tenant", "effective_limit"]
param_exprs:
# Server-side cap: param_exprs override caller values of the same
# name, so the ceiling is not spoofable by the client.
effective_limit: "arguments.limit < 200 ? arguments.limit : 200"
row_mode: many # single | many | scalar | affected_rows | resource_contents | stream | result_sets
timeout_ms: 3000
schema: { derive: input }
dev.mcpg.backend.twilioTwilio SMS + Voice Binding
Backend
alpha
v0.1.0-alpha.18Proxies the Twilio REST API for SMS and MMS, voice calls, recordings, number lookup and Verify OTP as operation-discriminated MCP tools, and mounts an HTTP route that receives Twilio’s inbound SMS, voice, gather and status webhooks — validating X-Twilio-Signature with a constant-time HMAC before any side effect — and answers with TwiML. Inbound events push resources/updated to subscribed MCP clients in-process, with no webhook round-trip.
Use it to Let an agent send SMS and answer inbound calls.
- Licence
- Apache-2.0
- Capabilities
- network_outbound, http_route_serve
Configuration sample
governance:
access:
oidc_oauth:
providers:
- issuer: "https://idp.example.com"
audiences: ["mcpg-gateway"]
verification: { kind: oidc_jwks, allowed_algs: ["RS256"] }
plugins:
- id: dev.mcpg.backend.twilio
class: backend
source: { oci: "ghcr.io/mcpg-dev/source-code/plugins/backend-twilio:protocol-1" }
# The grant is fail-closed and must cover every capability the descriptor
# requires — the http_route entity below opens a listener.
granted_capabilities: [network_outbound, http_route_serve]
# This `config:` block belongs to the http_route entity that receives
# Twilio's inbound webhooks. It is resolved at CONFIG LOAD, where only
# `${env.X}` and bound secret-provider URIs expand — a `cred://` ref
# would arrive as a literal string and break every signature check.
config:
account_sid: "${env.TWILIO_ACCOUNT_SID}"
# Webhook signatures are ALWAYS keyed by the Account Auth Token.
auth_token: "${env.TWILIO_AUTH_TOKEN}"
public_base_url: "https://mcpg.example.com"
validate_signature: true
max_body_bytes: 65536
inbound_sms:
auto_reply: "Thanks - an agent will follow up shortly."
mcp:
capabilities:
tools:
- name: twilio.send_sms
title: "Send SMS"
description: "Send an SMS (or MMS via media_url) from the configured number."
annotations: { read_only: false, idempotent: false }
governance:
minimum_trust: verified
input_schema:
type: object
required: [to, body]
properties:
to: { type: string, description: "E.164 destination, e.g. +14155551212" }
body: { type: string }
media_url: { type: array, items: { type: string } }
additionalProperties: false
backend:
kind: twilio
operation: send_sms
account_sid: "${env.TWILIO_ACCOUNT_SID}"
# Prefer a scoped, revocable API Key over the root Auth Token.
api_key_sid: "${env.TWILIO_API_KEY_SID}"
api_key_secret: "${env.TWILIO_API_KEY_SECRET}"
from: "+14155550100"